如何通过Google Apps Script从脚本A为脚本B副本创建时间触发器?
问题:通过脚本A为复制生成的脚本B副本创建时间触发器失败,寻求替代方案
我已经尝试了所有常规方法:在console.cloud.google.com启用Google Apps Script API、在脚本A中配置对应项目编号、确认脚本B副本的Script ID正确,但仍无法创建触发器。
补充说明:脚本B均由模板复制生成,无需手动部署,模板配置好函数后,无需打开脚本B即可从脚本A自动运行。现在需要替代方法,通过脚本A调用函数,利用Script ID为任意脚本B副本创建时间触发器。
相关代码
Script 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" } }
替代方案与问题排查
1. 404错误核心原因
复制生成的脚本B副本默认处于未初始化状态,项目未完成API访问配置,直接调用scripts.run会触发404。需要先完成脚本B的初始化,或改用高级服务直接操作触发器。
2. 替代方法:用Apps Script高级服务直接创建触发器
无需调用脚本B的函数,直接在脚本A中通过API为脚本B副本创建触发器:
步骤1:启用高级服务
在脚本A编辑器中,点击「资源」>「高级Google服务」,找到「Google Apps Script API」并启用。
步骤2:修改脚本A代码
function createTriggerForScriptB() { const scriptId = "Copy of Script B ID"; const triggerConfig = { functionName: "myFunction", triggerType: "CLOCK", recurrence: { type: "DAILY", hour: 23 } }; try { // 先验证脚本可访问,再创建触发器 ScriptApp.getProjectTriggers(scriptId); const newTrigger = ScriptApp.createTrigger(scriptId, triggerConfig); Logger.log("触发器创建成功:" + JSON.stringify(newTrigger)); } catch (err) { Logger.log("错误信息:" + err.message); } }
3. 权限配置要点
- 确保脚本A的运行账号拥有脚本B副本的编辑权限(复制生成的脚本默认仅复制者有编辑权)
- 脚本A需授权
https://www.googleapis.com/auth/script.projects和https://www.googleapis.com/auth/script.scriptapp权限 - 域内应用可通过G Suite管理员批量配置权限
4. 替代方案2:预初始化脚本B模板
在脚本B模板中添加初始化函数,复制后自动完成项目配置:
function initScript() { // 触发项目初始化,生成项目ID并启用API访问 ScriptApp.getProjectKey(); }
复制脚本B后,先通过脚本A调用初始化函数:
function initScriptB() { const scriptId = "Copy of Script B ID"; const url = `https://script.googleapis.com/v1/scripts/${scriptId}:run`; const options = { method: "post", headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() }, payload: JSON.stringify({function: "initScript"}), muteHttpExceptions: true }; const response = UrlFetchApp.fetch(url, options); Logger.log("初始化响应:" + response.getContentText()); }
初始化完成后,再调用原有的createTimeTrigger函数即可避免404错误。
内容的提问来源于stack exchange,提问作者Vishu Sharma
相关产品推荐
相关产品推荐

