2016年12月15日木曜日

Google Apps Script を紹介


皆様お疲れ様です。
入社一年目の佐藤範幸と申します。

去年も書かせていただきましたが、今年もアドベントカレンダーの記事を書かせていただきます。
よろしくお願いいたします。


Googleスプレッドシート、活用してますか?

近頃はなんでもかんでもGoogleに頼ってしまう風潮、ありません?
僕はこの風潮、大好きです。便利なんですよ。
もっと盛り上がってほしい。
盛り上がることで、Googleが提供するサービスが向上してほしい。
この前Google翻訳が進化して、ニューラルネットを活用した翻訳サービスが始まりましたね。
この調子でどんどん便利になってほしいですね。

さて、僕は少し前に新しいPCを買いましたが、性能に予算をかけてしまったせいでMicrosoft Officeを買うことが出来ませんでした。
そんな僕にぴったりのサービス。それが、Googleスプレッドシートです。
Googleスプレッドシートは表計算アプリケーションで、Microsoft Excelのように使うことが出来ます。

「でもマクロ使えないじゃん」

こう思ったIT技術者の皆さんいませんか?

実は同様の機能があるんです。


Google Apps Script 

それがこれ、Google Apps Script。

これを使えば、Excelのように簡単なマクロを組むことが出来ます。
主な言語は java script。なじみのある言語ですね。
サーバーサイドのjava script+Google独自の関数を用いて記述していきます。


ちょこっと実践

うろ覚え知識でクイズアプリを作ってみました。















簡素なものですが簡単に作れます。
ソースコードを全部載せます。勉強&作成途中のため汚いですが容赦ください。


//初期化
function initialize(){
 
  //シート取得
  var sheet_m = SpreadsheetApp.getActive().getSheetByName('main');
 var sheet_q = SpreadsheetApp.getActive().getSheetByName('question');
  var sheet_s = SpreadsheetApp.getActive().getSheetByName('set');
  var sheet_l = SpreadsheetApp.getActive().getSheetByName('log');
  
  //setシート
  if (sheet_s != null){
    SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheet_s);
  }
  SpreadsheetApp.getActive().setActiveSheet(sheet_q);
  sheet_s = SpreadsheetApp.getActive().duplicateActiveSheet().setName('set');
  
  //値クリア
  sheet_m.getRange('A1').setValue('第1問');
  sheet_m.getRange('B1').clearContent();
  sheet_m.getRange('B2').clearContent();
  sheet_m.getRange('B5').setValue(0);
  sheet_l.clear();
  sheet_l.getRange('A1').setValue('第1問');
  
  SpreadsheetApp.getActive().setActiveSheet(sheet_m);
  
}
//初期化
function initialize(){
 
  //シート取得
  var sheet_m = SpreadsheetApp.getActive().getSheetByName('main');
 var sheet_q = SpreadsheetApp.getActive().getSheetByName('question');
  var sheet_s = SpreadsheetApp.getActive().getSheetByName('set');
  var sheet_l = SpreadsheetApp.getActive().getSheetByName('log');
  
  //setシート
  if (sheet_s != null){
    SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheet_s);
  }
  SpreadsheetApp.getActive().setActiveSheet(sheet_q);
  sheet_s = SpreadsheetApp.getActive().duplicateActiveSheet().setName('set');
  
  //値クリア
  sheet_m.getRange('A1').setValue('第1問');
  sheet_m.getRange('B1').clearContent();
  sheet_m.getRange('B2').clearContent();
  sheet_m.getRange('B5').setValue(0);
  sheet_l.clear();
  sheet_l.getRange('A1').setValue('第1問');
  
  SpreadsheetApp.getActive().setActiveSheet(sheet_m);
  
}


//問題表示
function questionSet(){
  
  //シート取得
  var sheet_m = SpreadsheetApp.getActive().getSheetByName('main');
 var sheet_s = SpreadsheetApp.getActive().getSheetByName('set');
  var sheet_l = SpreadsheetApp.getActive().getSheetByName('log');
  
  //残問題数からランダムに選択
  var randomCount = sheet_s.getRange("E3").getValue();
  var range = sheet_s.getRange(Math.floor(Math.random()*randomCount),1,1,3);
  var values = range.getValues();
  
  //問題表示
  var questionCount = sheet_s.getRange("E2").getValue();
  sheet_m.getRange(1,2).setValue(values[0][1]);
  sheet_l.getRange(questionCount+1,2,1,3).setValues(values);
  sheet_l.getRange(questionCount+1,5).setValue(range.getRow());
  

}


//答え表示
function answerSet(){
  
  //シート取得
  var sheet_m = SpreadsheetApp.getActive().getSheetByName('main');
 var sheet_s = SpreadsheetApp.getActive().getSheetByName('set');
  var sheet_l = SpreadsheetApp.getActive().getSheetByName('log');
  
  var questionCount = sheet_s.getRange("E2").getValue();
  
  var answer = sheet_l.getRange(questionCount+1, 4).getValue();
  var answerMsg = 'A:' + answer + '\\n正解しましたか?';
  var yes_no = Browser.msgBox(answerMsg,Browser.Buttons.YES_NO);
  var rightCount = sheet_m.getRange(5, 2);
  var rightCount_v = 0;
  if (yes_no == 'yes'){
    sheet_l.getRange(questionCount+1, 5).setValue('○');
    rightCount_v = rightCount.getValue() +1;
  }else if(yes_no == 'no'){
    sheet_l.getRange(questionCount+1, 5).setValue('×');
    rightCount_v = 2;
  };
  
  
  rightCount.setValue(rightCount_v);
  if (rightCount_v == 3){
      Browser.msgBox('おめでとう。',Browser.Buttons.OK);
    }; 
  

}




スプレッドシートだけじゃない

Excelマクロのように使える、Excelの代わりになる、と推してきましたが、Google Apps Script はそれだけじゃありません。
実はGoogleが提供する他のサービスにも使えます。
例えばGoogleフォームに入力したデータをGmailで自動送信したり、フォームで入力したデータをスプレッドシートに連携させてまとめることが出来ます。
そして、これから流行ればより機能が拡張され、できることが増えていくでしょう。
みなさんも是非Google Apps Script を触って見てください。一緒に流行らせましょう。




最後までご覧いただきありがとうございました。








2 件のコメント:

  1. セキュリティ的なところの不安が払拭できない(運用部分が大きいけど)から踏み切るのが難しいけど、できたらスマートに全てオンラインドキュメントに移行したいね。

    返信削除
  2. 構文をみるとjavascript・・・なのかな?
    なかなかよさそうですね

    返信削除