LoginSignup
17
15

More than 5 years have passed since last update.

[GAS]実行に失敗: その操作を実行する権限がありません。に悩んだこと

Posted at

Google Apps ScriptでDebugをしていた際に、EventTriggerで少しハマった件について、メモを残しておきます。
やりたかったことは、Eventを拾ってその情報をLogシートに書き出しておくということ。

ハマったこと

SpreadsheetApp.openById();
を使った時に
実行に失敗: その操作を実行する権限がありません。
というエラーが出ていた。

var ss = SpreadsheetApp.openById(SheetID);

単体で実行する分には問題なかったのだが、EventTriggerから呼ばれた際に、エラーになっていた。

呼び出し元ソース

Common.gs
function onEdit(e)
{
  var r = e.source.getActiveRange();
  sample(r);
}

function sample(range)
{
  var useraddress = Session.getActiveUser().getEmail();
  range.setNote("Last modified: " + (new Date()) + "[modified by " + useraddress + "]");
  Log.debug(range.getA1Notation(), range.getValue());
}

function test_sample()
{
  sample(SpreadsheetApp.getActiveSheet().getRange("A1"));
}

単体の呼び出しは問題なし

Log.gs
var SheetID = PropertiesService.getScriptProperties().getProperty('SPREAD_SHEET_ID');
var LogSheetName = PropertiesService.getScriptProperties().getProperty('LOG_SHEET_NAME');
var Log = {
  debug: function (cell, message) { Log.write('Debug', cell, message); },
  write: function (logLevel, cell, message) {

    var ss = SpreadsheetApp.openById(SheetID);
    var logsheet = ss.getSheetByName(LogSheetName);
    var logValue = new Array();
    logValue = [ 
      logsheet.getLastRow()+1,       // A列
      new Date(),                    // B列
      logLevel,                      // C列
      cell,                          // D列
      message,                       // E列
      Session.getActiveUser().getEmail()
    ];
    logsheet.appendRow(logValue);
  }
};


// unit test
function log_test() {
  Log.debug("A1", "ログ出力");
}

log_test()
の実行は問題なし

Common.gs → Log.gsの参照に何か問題があるのか?

test_sample()
の実行は問題なし。

単体実行では問題なく動く。

どうもSpreadsheetにおいて、onEventからの場合に、setNote()は動作しているのに、Log.debugを呼び出すとopenByIdで止まっている。

理由はまだ不明だがトリガの設定をすることで解決

リソース>すべてのトリガー(ちなみに、「現在のプロジェクトのトリガー」でもよいです)
スクリーンショット 2014-11-20 17.22.22.png

スクリーンショット 2014-11-20 17.24.49.png

ここでトリガーを設定する。

スクリーンショット 2014-11-20 17.25.40.png

「保存」すれば問題ありません。

これで、実行するとエラーが無くなりました。

まとめ

  • なぜトリガの設定が必要だったのか
  • onEventはトリガを設定しなくても動くのに、SpreadsheetApp.openByIdはなぜ嫌がられたのか

この辺りはまだ調査中です。。。

GASのデバッグでの参考させていただいた記事

Google Apps Scriptでデバッグ

17
15
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
17
15