GoogleFormをアンケート遷移構造読み取り、QuickDiagramで可視化できるフォーマットに出力するGoogleAppScript

2 min read読了の目安(約2400字

背景

以前から定量調査を行う際にGoogleFormを使用する場合が多かったのですが、調査設計を複雑にした場合、回答のセクション移動が複雑になり、GoogleFormの編集画面で人間の目レビューするのがかなり集中しなければならいような状況でした。

QuickDiagramでフローチャート図で見える化する

QuickDiagramというテキストベースで以下のような記述をするとフローチャートを綺麗に描いてくれるサービスをTwitterで知り、GoogleFormをGASで遷移構造をデータ化して所定のフォーマットに直せばチェックがしやすくなりそうだなと思いコードを書いてみました。

GASのコード

コード.js
function checkFlow() {
  var form_url = "アンケートフォームとして使用しているGoogleFormのURL"
  var form = FormApp.openByUrl(form_url)
  var items = form.getItems()
  Logger.log("このツールはGoogleのアンケートフォームの遷移を確認するためのツールです")
  Logger.log("指定したフォームの構造を読み取り、複数選択時のセクション遷移、セクション終了時のセクション移動先情報を抜き出しquickdiagramのツールで可視化出来るフォーマットとして出力します")
  Logger.log("https://editor.quickdiagram.com/")
  
  var questions = [];
  var routes = ["graph TD"];
  var before = 0;

  for(var i=0;i<items.length;i++){
    var title = (items[i].getTitle() ? items[i].getTitle() : "").replace(/[^\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf0-9a-zA-Z]/g,'').replace(//g,'');
    if(items[i].getType() == FormApp.ItemType.PAGE_BREAK){
      if(items[i].asPageBreakItem().getGoToPage()){
        routes.push("i_" + i + "[" + title +"] --> i_" + items[i].asPageBreakItem().getGoToPage().getIndex())
      }
      routes.push("i_" + i + "[" + title + "] --> i_" + (i+1))
    }else if(items[i].getType() == FormApp.ItemType.MULTIPLE_CHOICE){
      var choices = items[i].asMultipleChoiceItem().getChoices();
      var is_gotopage = choices.some(function(choice){return (!!choice.getGotoPage())})

      if(is_gotopage){
        for(var j=0;j<choices.length;j++){
          var choice = choices[j];
          var value = (choice.getValue() ? choice.getValue() : "").replace(/[^\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf0-9a-zA-Z]/g,'').replace(//g,'')
          if(choice.getGotoPage()){
            routes.push("i_" + i + "[" + title + "] -- " + value + " --> i_" + choice.getGotoPage().getIndex())
          }else{
            routes.push("i_" + i + "[" + title + "] -- " + value + " --> i_" + (i+1))
          }
        }
      }else{
        routes.push("i_" + i + "[" + title + "] --> i_" + (i+1))
      }
    }else{
      routes.push("i_" + i + "[" + title +"] --> i_" + (i+1))
    }
  }
  Logger.log(routes.join("\n"))
}

出力された文字列をQuickDiagramにコピペ

以下のように出力されます。だいぶ見やすくなりますね。
良い調査ライフを。