GASで、Google Formの結果をGoogle Sitesに自動でページにしていくやつ

  • 45
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Googleフォームのアンケート結果をユーザ毎にGoogleサイトのページにします。
その時の自動化の仕組みにGAS(Google Apps Script)を利用します。

何が出来るの?

Google Form(アンケート)の結果が出力されたSpredSheetからGASでデータを取得して、Google Siteにアンケート内容のページをユーザごとに作れます。これをトリガー設定しておけば全自動です。

スプレッドシートに貯まったアンケート結果を、

元データ.png

Google Site上にユーザ毎ページとして作成できる。

以下で登場するGoogle Apps Scriptのコードを適宜設定して起動条件を設定しとけば、以下の様に自動でユーザ毎のページが出来上がります。

これを、1日1回起動するなどとトリガー設定しておくと、後は放っておくだけでページが出来ます。

ページ完成.png

何で作ったのか?=活用事例

会社でApps使ってるんですが、Google Form アンケートフォームを使って意見収集するということがよくあります。

ただ、その結果が書かれているスプレッドシートを生で公開しても、あんまり見られてないようなので、より全社に見える化するための施策の一つとして、そういう情報を一元的に貯めているGoogle Site上に展開しようと考え作りました。

さらに、Google Apps Scriptを使えば、こんなことも出来るんですよ。というのを全社にみせるため。という意図も含んでいます。

※自動起動トリガーを設定しなくても、Google Formのサブミットイベントを書いておけば、サブミット時点でページ作るというように、コレと同じことが出来ます。
が、今回は社内にGASを普及するという活動の一貫で、わりと参照されるサイト上に仕込んで仕組みのイメージを見せたかったのでこうしました。まぁ、あんまり普及してませんが。。

で、どうやるの?

人とツールの動きは以下のようになります。

Google_Formの結果をGoogle_Sitesに自動でページにしていくやつ.png

  1. 運営者:Google Form(アンケートフォーム)をメールで展開する。書いてね。と添えて。
  2. 回答者:フォームにアンケートに対する意見を書き込む。
  3. Form:フォームのサブミットが押下されると、対応したSpredSheetに書き込まれる。
  4. Site:予めトリガー設定しておいたSiteに仕込んだApps Scriptが、アンケート結果が書き込まれたSpredSheetからデータ取得して、自動でページを作成する(1日1回動くとか設定しておくと、1日単位で増えたユーザ分だけページ作成する)。

kwsk

では、その設定方法を書きます。

Google Siteを用意して、自動でページを作成する基点ページ(親ページ)を用意します。

親ページ作成.png

自動ページ作成用のGASを事前用意したGoogle Siteに仕込みます。

「その他」 > 「サイトを管理」を選択します。
GAS設定1.png

サイトの管理画面が開いたら、左メニュー「Apps スクリプト」>「新しいスクリプトを追加」ボタンを押下します。

GAS設定2.png

スクリプトエディタが開いたら、以下のサンプルソースをコピペです。
ソース内の★部を適宜書き換えます。

書き換える箇所(★部)

  • 親ページURL
  • アンケート結果のスプレッドシートのKey
  • ドメイン名(メルアド記録した後ユーザ名を抽出します。ドメイン名は不要なので空白置換用に設定します)
  • ヘッダ・データレンジ:スプレッドシートのヘッダとデータに合わせて範囲変えます。

GAS設定3.png

QuestionnaireWriter.js
// ★は適宜置換えます。

var TARGET_PAGE_PARENT_URL = “★https://sites.google.com/a/吐き出したいGoogle Site上の親ページURL”;

function main() {

  // Google Formのアンケート結果取ってくる
  var sheet = SpreadsheetApp.openById(“★対象のGoogle Formの結果が出力されているSpreadSheetのkey).getSheetByName("シート1");
  // ★ヘッダレンジ
  var header = sheet.getRange(1, 1, 1, 9).getValues();
  var lastrow = sheet.getLastRow();
  // ★データレンジ
  var data = sheet.getRange(2, 1, lastrow, 9).getValues();

  // ページ作成したい親ページを持って来る
  var page = SitesApp.getPageByUrl(TARGET_PAGE_PARENT_URL);

  for(var i=0; i < data.length; i++){

    var contents = "";

    var pageurl = data[i][1].toString();
    if( pageurl == "" ){ continue; }

    // ユーザ名(※メルアドから会社ドメイン名を切ったもの→ユニーク)
    pageurl = pageurl.replace(“★@ドメイン名,””);
    var pagetitle = pageurl;

    var tpage = page.getChildByName(pageurl);    
    if(tpage == null){
      // ユーザ名でページを作成する。が、もうあったら何もしない
      // ※同一ユーザによる複数ポストには対応してない。社員の体験レポートだったので複数ポストは基本ないので。
      page.createWebPage(pagetitle, pageurl, "");
      var tpage = page.getChildByName(pageurl);
    }else{
      continue;
    }

    for(var c=0; c < header[0].length; c++){

      // ヘッダだけちょっとH3で装飾
      contents = contents + "<h3>" + header[0][c].toString() + "</h3>";

      var datavalues = data[i][c].toString();

      // スプレッドシートの一番左の列=0列目に入る日付は、yyyy/MM/dd HH:mm:dd 形式にする
      if(c == 0){
        var dateobj = new Date(datavalues);
        //Sat Jun 23 2012 20:01:22 GMT+0900 (JST)

        var year = dateobj.getFullYear();

        var monthtmp = "0" + (dateobj.getMonth() + 1); 
        var month = monthtmp.substr(monthtmp.length - 2, monthtmp.length);

        var datetmp = "0" + (dateobj.getDate());
        var date = datetmp.substr(datetmp.length - 2, datetmp.length);

        var hourstmp = "0" + (dateobj.getHours());
        var hours = hourstmp.substr(hourstmp.length - 2, hourstmp.length);

        var minutestmp = "0" + (dateobj.getMinutes());
        var minutes = minutestmp.substr(minutestmp.length - 2, minutestmp.length);

        var secondstmp = "0" + (dateobj.getSeconds());
        var seconds = secondstmp.substr(secondstmp.length - 2, secondstmp.length);

        Logger.log(datavalues);
        Logger.log(year);
        Logger.log(month);
        Logger.log(date);
        Logger.log(hours);
        Logger.log(minutes);
        Logger.log(seconds);

        datavalues = String(year) + "/" + String(month) + "/" + String(date) + " " + String(hours) + ":" + String(minutes) + ":" + String(seconds) ;

      }else{
        // 「。」で改行
        datavalues = datavalues.replace(/\n\n/g,"。<br>"); 
      }

      contents = contents + datavalues;
      contents = contents + "<br><br><hr>"
    }

    // ページにはき出す
    tpage.setHtmlContent(contents);
  }
}

GAS実行承認を済ませる。

初回実行時に、承認用ダイアログが表示されますので、「続行」ボタンを押下して実行可能状態にしておきます。
ツールバーの「▶」ボタンを押下するか、メニューバーの「実行」>「main」で実行させます。

スクリーンショット 2013-12-20 14.01.29.png

トリガー設定して自動でGASを起動させる。

トリガー設定すると、GASを自動で動かせます。
「リソース」>「Current project’s triggers」を選択します。
※「All your triggers」でもどつちでも大丈夫です。

トリガー設定1.png

表示されたダイアログの「トリガー追加リンク」を押下します。

トリガー設定2.png

実行関数「main(このサンプルソースを使う場合)」、動くタイミングはお好きな時に、それぞれ設定します。

トリガー設定3.png

最後に:Google Apps導入してる会社に属する人間として思うこと。

今回作ったツール自体は大したことないのですが、こういうちょっとしたことが出来るだけでも、直接的なルーチンを減らして時間を効率よく使うということが出来ますし、社内を活性化・見える化するための一つになり得ます。

なので、個人的には、Google Appsを導入しているなら、管理職相応などの普段基本モノを作らない人もGASをちょい憶えたほうが良いと思っています。別に綺麗なソースを書けなくても十分意味がある。Excel中心文化ならVBAちょい覚えるのも一緒の類です。

Google Appsのサービスは、コミュニケーション基盤なので、エンジニアに限らず社員は皆使うものだから、何かこうなったら便利だな。というアイデアが腐るほどあるはずだからです。
それをちょこっと自分で形に出来る。ということに皆がなれば、もっと本来やるべき事に時間が割けるはずで、会社全体でもっと良い仕事が出来るはず。時間無駄に使うのは勿体無いですし、お客さんのために時間使うべきと思いますし。

私も管理者なので、普段はモノを作るための手を動かしませんが、やっぱりやりたいことが一杯出てくるので憶えようと思いました。

とか言いつつ、その感覚とかGASそのものを社内に広めるのが中々難しくて苦戦してます。
あと、自分もコーディング能力もっと鍛えないとダメなので、ココに書いてるのは全部自分の戒めです。失礼しました。