트리거 오류 : 죄송합니다. 저장소에서 읽는 동안 서버 오류가 발생했습니다. 오류 코드 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 런타임을 일시적으로 비활성화하는 것이 좋습니다.