2014年6月27日金曜日

[GAS] onEditでの注意点


今日もGoogle Apps Scriptのお話です。
onEditファンクションはスプレッドシートのセルが更新されるたびに呼ばれます。
とても便利ですが、注意すべき点があります。
例えば以下の様なスプレッドシートがあるとします。
B1列にはファイルIDが書かれています。
そのファイルIDの示すドキュメントはこちら。

このドキュメントのファイル名を取得してB2セルに書き込む処理を考えます。
普通に書くとこんな感じです。
function func01() {
  var range = SpreadsheetApp.getActiveSheet().getRange(1, 2);
  // セルに記載された文字をIDとしてドライブからファイルを読み込む。
  var file = DriveApp.getFileById(range.getValue());
  // ファイル名をB2セルへ書き込む。
  SpreadsheetApp.getActiveSheet().getRange(2, 2).setValue(file.getName());
}
結果は
こんな感じ。想定通りです。

続いて本題のonEditを使った処理です。
B1セルにファイルIDを記述した、というイベントを拾ってファイル名を取得、書き込みを実行します。
function onEdit(param) {
  // 編集されたセルの参照を取得する。
  var range = param.range;
  if (range.getRow() != 1 && range.getColumn() != 2) {
    // B1のセル以外が編集された場合は処理を抜ける。
    return;
  }
  // セルに記載された文字をIDとしてドライブからファイルを読み込む。
  var file = DriveApp.getFileById(range.getValue());
  // ファイル名をB2セルへ書き込む。
  SpreadsheetApp.getActiveSheet().getRange(2, 2).setValue(file.getName());
}
結果は
書き変わりません・・・
ロジック的には間違ってないはずですが・・・
実行ログを見てみると・・・
権限が無い、というエラーが発生しています。
これは私の憶測ですが、onEditでバンバン更新されて
バンバンGoogleドライブにアクセスされたらたまらん!
というGoogleの中の人の防御策ではないかと思っています。
私がGoogleの中の人だったら

「読めなくすりゃいんじゃね?onEditでドライブなんか読みに来んなよ。迷惑なんだよ。」

と思うと思いますので仕方ないですかね。


拍手する にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村

プログラマー ブログランキングへ

0 件のコメント:

コメントを投稿