*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なセル上には配置できないらしい
- 長いリストをスクロールするとボタンが消える
- 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');
- cloud serviceのcallを極力減らすよう常に意識すること
- https://developers.google.com/apps-script/best_practices?hl=ja は必読
- これもお勧め http://stackoverflow.com/questions/15145918/what-is-faster-scriptdb-or-spreadsheetapp
- イベントリスト https://developers.google.com/apps-script/understanding_events
- callback functionにはevent objectを渡すことが出来る
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を開いているユーザの権限で実行される。なので特別な権限は不要。
https://developers.google.com/apps-script/guide_libraries
ライブラリを使うと関数を別プロジェクトでincludeできる
ライブラリへのアクセス、プロジェクトへのインクルードの仕方
- インクルードするには、少なくともライブラリへのアクセス権限が必要。無い場合はscript authorへコンタクトする。
- インクルードするにはライブラリのプロジェクトキーが必要。確認はライブラリを開いて File -> Project Propertiesから。
- Resources_> Manage Librariesからライブラリを見つける
- includeしたいバージョンを選ぶ
- インクルードライブラリの識別子を入力する。たとえばMyPicasaApiとか。するとプロジェクト内ではMyPicasaApi.doSomething()で呼べるようになる。もし既存のクラス(たとえばUiApp)と被ると既存クラスがオーバライドされる。
- デバッギングモードの選択。デバッギングモードをオンにすると、ライブラリでバージョニングされていない最新の修正を取り込んで動作各確認できる
ライブラリをシェアするには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) { ... }
shared and not-shared
リソースとは Script Propertiesとか Triggeresとか User Propertiesとか Loggerとか GMailAppとかのこと。
詳細はここをみる https://developers.google.com/apps-script/guide_libraries#scoping