【发布时间】:2016-04-01 04:29:55
【问题描述】:
覆盖文件。覆盖 Apps 脚本文件。
这不是要创建新的 Apps 脚本文件的问题。那对我没有帮助。我需要更新现有的 Apps 脚本文件。这个问题类似于创建一个新文件,但它不是同一个问题。更新的语法和更新的要求可能与创建新文件有很大不同,我无法从有关创建新文件的答案中获得解决方案。我查看了创建新文件的答案,但没有回答我的问题。
我已尝试使用 Advanced Drive Service 将现有的 Apps 脚本文件更新为另一个 Apps 脚本文件。
function updateMyScript() {
var targetFileID = 'File ID';
var dataSource = {
"files": [
{
"id":"739a57da-f77c-4e1a-96df-7d86ef227d62",
"name":"Code",
"type":"server_js",
"source":"function doGet() {\n return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
},
{
"id":"2c7e8b5a-dbc5-4cd2-80e9-77b6291b3167",
"name":"index",
"type":"html",
"source":"\u003chtml\u003e\n \u003cbody\u003e\n New message!!\n \u003c/body\u003e\n\u003c/html\u003e"
}
]
};
var filesResource = Drive.Files.get(targetFileID);
var blob = Utilities.newBlob(JSON.stringify(dataSource), "application/vnd.google-apps.script+json");
var whatRezult = Drive.Files.update(filesResource, targetFileID, blob, {"convert":"true"});
Logger.log('whatRezult: ' + whatRezult);
};
dataSource 对象中的id 属性是项目内每个特定.gs 或html 文件的ID。我通过将“目标”应用程序脚本文件下载到 JSON,然后打开 JSON 文件并复制文件 ID 来获得这些 ID。所以,我知道这些是正确的。我想要一种使用代码从项目中检索这些单个文件 ID 的方法。关于创建 new 应用程序脚本文件的帖子没有说明如何从项目文件中获取“子”ID。项目文件 ID 与项目内部的每个文件 ID 不同。 name 和 type 属性很明显。从示例中,只有两种类型的文件具有server_js 和“html”类型。看起来 Apps Script 项目文件的内部文件的 source 可以是字符串文字。因此,您可以输入任何您想要的替换内容。
target ID 是不言自明的。
如果有办法通过高级驱动器服务或UrlFetchApp.fetch() 来回答我的问题。我只想使用 Apps 脚本。所以,我不是在寻找用其他语言编写的解决方案,也不是在 Apps 脚本之外运行的解决方案。
使用上面的代码,我从倒数第二行得到一个错误:
Drive.Files.update(filesResource, targetFileID, blob, {"convert":"true"});
错误是:
该应用没有更新 Apps 脚本所需的范围。
因此,很明显,它正在寻找在某处指示的范围设置。我猜它会进入选项的第四个参数。
【问题讨论】:
-
Henrique 在 this post 的 cmets 中指出,通过
Drive.Files.Update()路由无法设置所需的drive.scripts范围,因此多步骤UrlFetchApp()过程是唯一的方法如此处的答案中提供的那样