トリガーエラー:申し訳ありませんが、ストレージからの読み取り中にサーバーエラーが発生しました。エラーコードPERMISSION_DENIED

Dec 03 2020

時間ベースのトリガーから呼び出された私のGappsスクリプトは、「申し訳ありませんが、ストレージからの読み取り中にサーバーエラーが発生しました。エラーコードPERMISSION_DENIED」という大量のエラーをログに記録しています。アプリとトリガーをインストールしたが、後でスクリプトを実行するためのアクセス許可を削除したユーザーがいると思います。これは明らかに、この問題を引き起こす可能性があります。私はまだそれを避けようとして失敗しています...

トリガーのインストール方法は次のとおりです。

var triggerFunction = "processRecurrentLists";  //trigger callback function name

//---------------------------------------------
function createTriggers(tmz) {
  // Trigger running at 1am depending on timezone specified in settings
  // If no timezone specified, script timezone is used (GMT)
  ScriptApp.newTrigger(triggerFunction)
      .timeBased()
      .everyDays(1)
      .inTimezone(tmz)
      .atHour(1)
      .create();
      
}

これはトリガーされた関数です:

function processRecurrentLists() {
  // Check if the actions of the trigger requires authorization that has not
  // been granted yet; if not, then end - nothing to do.
  if (!isScriptAuthorized()) {
    console.warn("RecGTasks script is not authorized to run. Please, authorize first.");
    return;
  }

  // ... more code here
}

そして機能テストの承認:

function isScriptAuthorized() {
  try {
    var authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL);
    return (authInfo.getAuthorizationStatus() == ScriptApp.AuthorizationStatus.NOT_REQUIRED);
  } catch (e) {
    console.warn("Script not authorized. err=%s",e.message);
    return false;
  }
}

私の仮定では、スクリプトが承認されておらず、スクリプトが正常に終了した場合、関数isScriptAuthorizedはfalseを返しますが、そうではないようです...

これについて何か考えはありますか?

アップデート1の回避策として、すべてのユーザーがスクリプトにアクセスできるようにしましたhttps://issuetracker.google.com/issues/175139769また、同じ日にメッセージが「そのアクションを実行するには承認が必要です。」に変更されたため、PERMISSION_DENIEDは不要になりました。さらに調査します。

アップデート2はい、@ ziganotschkaが指摘したように、V8に関連しています。次のスクリプトを使用して、徹底的にテストしました。

function doGet() {
  // if trigger not installed
  if (ScriptApp
      .getProjectTriggers()
      .filter(function(t){return t.getHandlerFunction() === "myFunction"})
      .length == 0
     ){
    // create trigger firing every 1min
    ScriptApp.newTrigger("myFunction")
    .timeBased()
    .everyMinutes(1)
    .create();      
  }
  return HtmlService.createHtmlOutput('<h1>Trigger test installed</h1>');
}

function myFunction() { 
  Logger.log("Hello from triggered function");
  return ("Hello from server");
}

回答

2 ziganotschka Dec 03 2020 at 18:10

v8ランタイムに関連するバグのようです

こことここを見てください。

この問題は、ユーザーが一度に複数のアカウントでサインインした場合に発生するようです。

Googleがバグを修正している間、問題を回避するためにv8ランタイムを一時的に無効にすることをお勧めします。