79
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Apps ScriptAdvent Calendar 2013

Day 20

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

Last updated at Posted at 2013-12-21

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そのものを社内に広めるのが中々難しくて苦戦してます。
あと、自分もコーディング能力もっと鍛えないとダメなので、ココに書いてるのは全部自分の戒めです。失礼しました。

79
91
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79
91

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?