我们如何从独立脚本 A 运行函数,以使用 Google Apps 脚本在独立脚本 B 中创建基于时间的触发器?

问题描述 投票:0回答:1

我已经尝试了一切,包括在console.cloud.google.com中启用Google Apps脚本API,在脚本A中设置该项目的项目编号,并确保脚本B的项目ID正确。然而,触发器仍未被设置。我想澄清的是,脚本 B 将始终使用模板脚本 B 的新副本进行更新,并且将使用模板来创建其副本。无需在脚本 B 中手动部署任何内容。一旦在模板中设置了必要的函数,它们将从脚本 A 中自动运行,而无需打开脚本 B。是否有其他方法可以在脚本 A 中运行函数可以使用脚本 ID 在脚本 B 的任何副本中设置基于时间的触发器吗?

脚本A

function callScriptBTriggerFunction() {
  const scriptId = "Copy of Script B ID"; 

  const url = `https://script.googleapis.com/v1/scripts/${scriptId}:run`;

  const requestBody = {
    "function": "createTimeTrigger"
  };

  const fetchOptions = {
    method: "post",
    contentType: "application/json",
    headers: {
      Authorization: "Bearer " + ScriptApp.getOAuthToken()
    },
    payload: JSON.stringify(requestBody),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, fetchOptions);
    
    Logger.log("Response Code: " + response.getResponseCode());
    Logger.log("Response Body: " + response.getContentText());
  } catch (err) {
    Logger.log("Error: " + err);
  }
}

脚本 B 的任何副本

function createTimeTrigger() {
  ScriptApp.newTrigger('myFunction')
           .timeBased()
           .everyDays(1)    
           .atHour(23)  
           .create();
}

function myFunction() {
  Logger.log("myFunction ran at: " + new Date());
}

我得到错误

Response Body: {
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "status": "NOT_FOUND"
  }
}
google-apps-script google-apps-script-api
1个回答
0
投票

使用脚本 API 从另一个脚本访问脚本

我复制了您的代码来测试和调试您遇到以下错误的原因:

Response Body: {
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "status": "NOT_FOUND"
  }
}

发生错误的原因是代码中引用的

Script ID
与目标脚本(脚本B)的有效部署不对应。当将脚本 B 部署到可执行 API 期间创建的
Deployment ID
未在调用脚本 (脚本 A) 中正确更新时,通常会发生这种情况。

您可能忘记更新将脚本 B 部署到可执行 API 时创建的部署 ID,或者您可能错过了需要将其部署为 API 可执行文件的部分。您需要复制部署 ID 并替换代码中的脚本 ID。

您可以查看这篇关于 API 可执行文件

的文章

更新这部分代码:

const scriptId = "Replace this with the deployment ID of Script B";

更新部署 ID 后,保存更改并运行

callScriptBTriggerFunction

它应该返回这样的响应:

Notice
Execution started
Info
Response Code: 200
Info
Response Body:
{
  "done": true,
  "error": {
    "code": 3,
    "message": "ScriptError",
    "details": [
      {
        "@type": "type.googleapis.com/google.apps.script.v1.ExecutionError",
        "scriptStackTraceElements": [
          {
            "function": "createTimeTrigger",
            "lineNumber": 2
          }
        ],
        "errorMessage": "Exception: You do not have permission to call ScriptApp.newTrigger. Required permissions: https://www.googleapis.com/auth/script.scriptapp",
        "errorType": "ScriptError"
      }
    ]
  }
}

然后您可能会遇到另一条错误消息,指出:

异常:您无权调用 ScriptApp.newTrigger。

不幸的是,目前没有足够的文档来解释为什么此权限受到限制。不过,您可以参考这篇 Stack Overflow 帖子,了解更多见解和潜在的解决方法。

参考文献:

Google Cloud 项目 项目管理

© www.soinside.com 2019 - 2024. All rights reserved.