Skip to content

Instantly share code, notes, and snippets.

@nikushi
Last active January 5, 2016 07:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikushi/21307410e7caea14eb9c to your computer and use it in GitHub Desktop.
Save nikushi/21307410e7caea14eb9c to your computer and use it in GitHub Desktop.
Google Apps Script For Beginnerを読んでいる。途中のメモ書き

chapter 1

簡単なデバッグ

*Logger.log('message') コンソールログ

  • throw('message') flash alert的なポップアップ
  • SpreadsheetApp.getActiveSpreadsheet().toast('message') Spreadsheet等の右側にポップアップメッセージ
  • Browser.msgBox('hello world'); 中央にポップアップメニュー + button。Browerクラスでは文字列入力などのポップアップも出せる

スプレッドシートの自動整形

  • シェアドキュメントなどでは列のwidth, 色、フォントサイズ、フォントファミリーを調整する必要がある
  • レイアウトをresetするfunctionを定義してみる
function resetPageLayout() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('シート1');
  ss.toast('Now processing your sheet', 'Wait a few seconds', 5);
  var header1 = sh.getRange('A1:G1').mergeAcross().setBackground('silver').setValue('Party menu suggestion');
  var header2 = sh.getRange(2,1,1,7).setBackground('#aaaaff').setValues([['First Name', 'Last Name', 'Drink', 'Softs', 'Appetizers', 'Meal', 'Dessert']]);

  sh.getRange(1,1,2,7).setBorder(true,true,true,true,true,true).setHorizontalAlignment('center').setVerticalAlignment('middle').setFontWeight('bold').setFontSize(14);
  var columnWidth = [150,150,180,180,300,200];
  for(var n=0; n < columnWidth.length; n++) {
    sh.setColumnWidth(n+1, columnWidth[n]);
  }
  
  sh.insertColumnAfter(7).deleteColumns(8,sh.getMaxColumns()-7);
  
  sh.insertRows(sh.getLastRow()+1,20);
  sh.deleteRows(sh.getLastRow()+1, sh.getMaxRows()-sh.getLastRow()-10);
  
  sh.getRange(3,1,sh.getMaxRows()-2,sh.getLastColumn()).setBorder(false,true,false,true,true,false);
  for (var n=sh.getLastRow(); n > 3; n--) {
    Logger.log(n+' '+sh.getRange(n,1,1,7).getValues());
    
    if(sh.getRange(n,1,1,7).getValues().toString().replace(/,/g,'')=='') {
      sh.deleteRow(n);
      Logger.log('row '+n+' deleted');
    }
  }
  sh.setFrozenRows(2);
  SpreadsheetApp.flush();
  Browser.msgBox('Now your sheet should be clean again!');
}

メニューから関数を実行

  • 都度スクリプトエディタから実行するのはしんどい
  • スプレッドシートのメニュバーにカスタム項目を追加し、メニュバーから実行させる
function createMenu() {
  var menuEntries = [ {name: "say hello", functionName: "sayHello"} ];
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.addMenu("my menu", menuEntries);
}

function sayHello() {
  // say something
}

ただし上の例ではシートを再オープンするとメニューが消える。関数名をonOpen()に変更することで、シート起動のイベントから自動実行される。

function onOpen() { // automatically run this on open a spreadsheet.
  var menuEntries = [ {name: "say hello", functionName: "sayHello"} ];
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.addMenu("my menu", menuEntries);
}

function sayHello() {
  // say something
}

メニューからではなく、ボタンを配置し実行することもできる。

  • spreadsheet menu -> 挿入 -> 図形描画, 好きなデザインのボタンを作る
  • ボタンをクリックし"スクリプトを割り当てる"で関数を割り当て! Thant's it!

ボタンメニュに関してのデメリット

  • 誰でも移動できたり消せるので、shared documentでは向かない
  • protectedなセル上には配置できないらしい
  • 長いリストをスクロールするとボタンが消える

reading/writing data from spreadsheets ベストプラクティス、パフォーマンス

  • action毎にgoogleのサーバにリクエストを送って、ヴェリファイしてプロセスして変更点をクライアントに送る処理がある
  • 100 cell をfillするときにone by oneでは遅い。1回で済ませるようにする
//bad
for (..) {
  sh.getRange(n,1).setValue('Value');
}

//good
sh.getRange(1,1,100,1).setValue('Value');

Catching Event

function onEdit(e) {
  e.range.setComment("Edited at: " + new Date().toTimeString());
}
  • trigger

特定のイベントが起きた際に実際に読まれるscript resource(例えばfunction)のこと。 https://developers.google.com/apps-script/understanding_triggers

simple triggerはspreadsheetを開いているユーザの権限で実行される。なので特別な権限は不要。


Libraries

https://developers.google.com/apps-script/guide_libraries

ライブラリを使うと関数を別プロジェクトでincludeできる

Managing Libraries

ライブラリへのアクセス、プロジェクトへのインクルードの仕方

  • インクルードするには、少なくともライブラリへのアクセス権限が必要。無い場合はscript authorへコンタクトする。
  • インクルードするにはライブラリのプロジェクトキーが必要。確認はライブラリを開いて File -> Project Propertiesから。
  • Resources_> Manage Librariesからライブラリを見つける
  • includeしたいバージョンを選ぶ
  • インクルードライブラリの識別子を入力する。たとえばMyPicasaApiとか。するとプロジェクト内ではMyPicasaApi.doSomething()で呼べるようになる。もし既存のクラス(たとえばUiApp)と被ると既存クラスがオーバライドされる。
  • デバッギングモードの選択。デバッギングモードをオンにすると、ライブラリでバージョニングされていない最新の修正を取り込んで動作各確認できる

Creating a library

ライブラリをシェアするには3つのことがある。ライブラリに少なくともリード権限を与える。ユーザ(ライブラリを利用するユーザ)にproject keyを教える。1つ以上のバージョニングを保存する。

Best practices

  • project(ライブラリになるproject)には適切な名前を付けること。ユーザからみるとIdentifyになるので
  • privateなメソッドは_で終わる名前をつける。 e.g. myPrivateMethod_()
  • ライブラリのユーザにスクリプトエディタのautocompleteで表示されるドキュメントを与えたいなら、関数の上にJSDoc style documentationを書くこと。https://developers.google.com/closure/compiler/docs/js-for-compiler
/**
* Raises a number to the given power, and returns the result.
*
* @param {number} base the number we're raising to a power
* @param {number} exp the exponent we're raising the base to
* @return {number} the result of the exponential calculation
*/
function power(base, exp) { ... }

Resource scoping

shared and not-shared

リソースとは Script Propertiesとか Triggeresとか User Propertiesとか Loggerとか GMailAppとかのこと。

詳細はここをみる https://developers.google.com/apps-script/guide_libraries#scoping

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment