こんにちは。 キャスレーコンサルティングの
Google Apps Script大好きエンジニアの金巻と申します。

これまでも、技術ブログでは
実務で使えるGoogleAppsScript 入門編
Google Apps Scriptで、心温まる年賀状を作ろう!
Google Apps Scriptとラベルで実現する業務効率化のすゝめ
Google Apps Scriptでカレンダー連動リマインドのすゝめ
Google Apps Scriptで未回答のイベントをリマインド
Google Apps Scriptでイベントの回答状況を一覧化
Google Apps ScriptでGoogleカレンダーの一括登録術

と、Google Apps Scriptに関する記事が多い書かれてきましたが
今回は、GoogleフォームとGoogle Apps Script(以下GAS)を使った
「簡易サーベイシステム運用術」をご紹介します。

<紹介する内容>

・GASとは(復習)
・GoogleForm(Googleフォーム)とは
・サーベイとは
・フォームの作成
・危険信号はすぐに検知!
・データの分析
・おわりに

GASとは(復習)

次に、本題のGASについてですが、メール・ドライブ・スプレッドシート・ドキュメント・カレンダー・マップなど、様々なGSuiteのアプリケーションに、独自の機能を追加するためのスクリプト言語です。

言語仕様は、JavaScriptをベースにしており、JavaScript + Google APIというイメージです。
各APIについては、GAS公式に網羅されています。

GoogleForm(Googleフォーム)とは

GoogleFormはG Suiteの一つで、G SuiteとはGoogleが提供しているグループウェアツール群の総称です。

アンケートフォームに利用をするのが一般的ですが、今回は“定期的に同じ質問への回答を求め、変化を調査するサーベイ方式”で利用します。

サーベイとは

「調査・探査、測量や測定という意味の言葉」ですが、今回は社員の状態を毎月調査するサーベイを作ります。

フォームの作成

仮にこんなフォームを用意しました。
「仕事の充実度」と「仕事以外の充実度」で二つの状態をサーベイします。

各項目10段階で充実度を調査します。
もし、低い値だったら充実していない状態なので、すぐに対応しなければなりません!

危険信号はすぐに検知!

さて、サーベイに回答があったことを知るには、どうすればよいでしょうか?
一つの方法として回答結果をスプレッドシートに吐き出すようにして、
そのスプレッドシートが更新される度に、通知するように設定する事で、
フォームが送信される事により(スプレッドシートの更新を検知して)、メールにて通知を受け取る事が出来ます。

ただ、これは更新全てを通知してしまうため
「充実している = 問題がない回答」
に対しても、通知を受け取ることになります。

そこでGASを利用しましょう。

流れとしては
 1)フォームのGASとして通知スクリプトを記載
 2)フォーム送信時のトリガに、1)で作った通知スクリプトを指定
でやっていきましょう。

フォームの右上の3つの縦に並んだ点をクリックし、「スクリプトエディタ」を開きます。

スクリプトエディタが開くと、デフォルトでmyFunctionが表示されています。

ここに、通知の仕組みをコーディングしていきましょう。
メール送信させる場合には、以下のような感じです。

function myFunction(e) {
  //フォームに入力された内容
  var itemResponses = e.response.getItemResponses();
  //フォームが取得したメールアドレス
  if(! isSendMail(e.response.getRespondentEmail())){
     return;
  }
  //フォーム内容格納変数
  var alertAnswer = "";
  
  //入力項目の解析
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();//質問
    var answer = itemResponse.getResponse();//回答
    if(answer <= 2){//通知する危険度を2以下に設定
      alertAnswer += itemResponse.getItem().getTitle() + ":"+ itemResponse.getResponse();
    }
  }
  
  if(alertAnswer.length > 0){
    sendEmail(alertAnswer);
  }
}

function sendEmail(mail
Message){
  var sendToMailAdress = "xxxxxxx@casleyconsulting.co.jp";
  //Gmailを使用して送信  
  GmailApp.sendEmail(sendToMailAdress ,"GoogleFormに投稿されました。",mailMessage,{noReply:true});
}

function isSendMail(mailAdress){
  if(/* メールアドレスが通知対象のメールである条件 */){
    return true;
  }else{
    return false;
  }
}

メールではなくSlackに送信させる場合には、sendEmailの代わりに以下の様にします。

function slackSend(message){
  
  var jsonData =
  {
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch("WebhookURL", options);
}

あとはmyFunctionをトリガーに登録し、起動条件をフォーム送信時に設定します。

これで、任意のユーザーの“ある条件に一致した回答のみ”を通知する仕組みが出来ました。
これにより、充実度が低い人などの情報を瞬時に把握する事が出来ます。

データの分析

全量での分析は、アンケートと変わらない使い方でGoogleフォーム標準の結果などから
分析すれば良いですが、サーベイでは1人毎の推移などを分析したい場合があります。

抽出に関しても、GASを利用できます。
今回やりたいことは以下の通り。

【一人の回答だけを抽出し見やすく表示する】
実現させるには、フォームの回答結果が書き込まれたスプレッドシートのデータを使用します。
こちらに、先ほどのフォームの結果情報があります。

この中から、カーソルがある行の人物の結果のみを抽出するGASを作成します。

function myFunction() {
  //選択中のシート情報を取得する
  var objSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = SpreadsheetApp.getActiveSheet();

  
  //選択中のセルを取得する
  var objCell = objSheet.getActiveCell();
  var col = objCell.getColumn();
  var row = objCell.getRow();

 //選択行が回答データじゃない場合はメッセージを表示して処理を終了します。  
  if(row > objSheet.getLastRow() || row == 1){
    Browser.msgBox('回答のある行にカーソルを合わせてください');
    return;
  }
  
 //現在のシートの後ろに「分析シート」というシートを追加し、そちらに抽出内容を吐き出していきます。
  objSpreadSheet.insertSheet('分析シート', 1);
  SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].activate();
  var newSheet = objSpreadSheet.getSheets()[1];
  
 //ヘッダ部分、質問項目を出力します。
  var targetMail = objSheet.getRange(row,2).getValue();
  newSheet.getRange(1,1).setValue(targetMail);
    for(var j=3; j<=objSheet.getLastColumn(); j++){
    newSheet.getRange(2,j - 1).setValue(objSheet.getRange(1,j).getValue());
  }

  var writeRow = 3;
  for (var i=2; i<=objSheet.getLastRow() ; i++) {
    //メールアドレスが選択行のアドレスと一致する場合のみ出力します。
    if(objSheet.getRange(i,2).getValue() == targetMail){
      newSheet.getRange(writeRow,1).setValue((writeRow - 2) + '回目');
      for(var j=3; j<=objSheet.getLastColumn(); j++){
        newSheet.getRange(writeRow,j - 1).setValue(objSheet.getRange(i,j).getValue());
      }
      writeRow++;
    }
  }
  //処理終了のメッセージを出力します。
  Browser.msgBox('抽出が完了しました');
}

カーソル位置にある行のメールアドレスについて、抽出する仕組み。
実行するとこ、んな感じにシートが作成されます。


抽出されたデータにより、状況を分析出来ますね。

おわりに

今回は、GASを使ったGoogleFormの活用方法をご紹介いたしました。

質問内容によって抽出方法が年齢だったり、部署だったり分析に必要なキーは変わるかと思いますが、
フォームによる集計からGASにより、データ抽出等の定型作業を効率化することが可能です。

ご一読頂き有難うございました。

金巻
エンジニア 金巻
入社から4年あまり金融系プロジェクトを経て、昨年より社内受託業務に従事しております。