问题描述
Function 1. - Create a new folder and retrieve the ID.
Function 2. - Create a copy of a doc file in the folder.
Function 3. - Replace the text of several tags of type {{TEXT}} in the document.
Function 4. - Insert an image in the document.
Function 5. - Retrieve the public link of the doc document.
这 5 个函数使用“全局”函数在同一个 Apps 脚本中顺序执行,该函数允许我检索创建的文件夹和 Doc 文档的 ID。 我使用 cURL(从终端)运行此 Apps 脚本。
脚本的持续时间大约为 10 秒,我想知道是否有可能在每个功能完成时获得更新的消息(或文本值)作为响应。
我在互联网和 Stackoverflow 上查看过,但我发现的所有内容都是指在电子表格中使用“flush”命令来更新单元格的值。我需要的是更新终端中的响应消息。
有人可以帮我吗?
非常感谢。
瓦迪姆
解决方法
从您的以下功能中,
功能 1. - 创建一个新文件夹并检索 ID。 功能 2. - 在文件夹中创建 doc 文件的副本。 功能3. - 替换文档中几个{{TEXT}}类型的标签的文本。 功能 4. - 在文档中插入图像。 功能 5. - 检索文档的公共链接。
我认为在您的情况下,可以使用以下 3 种模式。
-
所有功能都被整合为一个功能。
- 在这种情况下,您的
I would like to know if it is possible to get a message (or a text value) in response that is updated as each function is completed.
目标无法实现。 - 为了在每个函数完成时检索响应,每次使用 curl 命令执行每个函数。 Rubén's comment 已经提到了这一点。
- 在这种情况下,您的
-
在“功能1”创建新文件夹ID时,文件夹ID从函数返回,文件夹ID用于“功能2”。并且,当文档被复制时,文档 ID 从函数中返回并将其用于“函数 3”、“函数 4”和“函数 5”。
- 在这种情况下,不需要使用全局变量。为了检索响应,每次使用 curl 命令执行每个函数。但是,当每个函数执行时,每个响应值都需要提供给下一个函数。我认为这可能有点复杂。
-
在“Function 1”处创建新文件夹 id 时,将文件夹 ID 放入 PropertiesService,当运行“Function 2”时,使用从 PropertiesService 检索到的文件夹 ID。并且,在复制 Document 时,将文档 ID 放入 PropertiesService,当运行“Function 3”、“Function 4”和“Function 5”时,使用从 PropertiesService 检索到的文档 ID。
- 在这种情况下,不需要使用全局变量。并且,在每个函数运行期间放置和获取文件夹ID和文档ID。这样,每个函数都可以使用 curl 命令按顺序运行。所以,我认为使用 curl 命令的脚本可能会变得有点简单。
根据以上情况,我想在我的答案中提出模式3。
用法:
示例脚本:
作为测试此模式的示例脚本,使用以下脚本。
// Create a new folder and retrieve the ID.
function function1() {
const folderId = DriveApp.createFolder("sampleFolder").getId();
PropertiesService.getScriptProperties().setProperty("folderId",folderId);
return "Function1: Done.";
}
// Create a copy of a doc file in the folder.
function function2() {
const folderId = PropertiesService.getScriptProperties().getProperty("folderId");
const folder = DriveApp.getFolderById(folderId);
const documentId = DocumentApp.create("sampleDocument").getId();
DriveApp.getFileById(documentId).moveTo(folder);
PropertiesService.getScriptProperties().setProperty("documentId",documentId);
return "Function2: Done.";
}
function function3() {
const documentId = PropertiesService.getScriptProperties().getProperty("documentId");
// do something
return "Function3: Done.";
}
function function4() {
const documentId = PropertiesService.getScriptProperties().getProperty("documentId");
// do something
return "Function4: Done.";
}
function function5() {
const documentId = PropertiesService.getScriptProperties().getProperty("documentId");
// do something
return "Function5: Done.";
}
- 在此示例脚本中,文件夹 ID 和文档 ID 在每个函数运行期间被放入和获取。
- 在这个示例脚本中,没有包含错误处理。所以当你使用它时,请添加它。
测试。
为了从每个函数中检索每个响应,在这种情况下,脚本运行了 5 个 curl 命令。示例脚本如下。
#!/bin/sh
accessToken="###your access token###"
url="https://script.googleapis.com/v1/scripts/###your script ID###:run"
curl -X POST -H "Authorization: Bearer ${accessToken}" -H "Content-Type: application/json" -d "{\"function\": \"function1\",devMode: true}" ${url}
curl -X POST -H "Authorization: Bearer ${accessToken}" -H "Content-Type: application/json" -d "{\"function\": \"function2\",devMode: true}" ${url}
curl -X POST -H "Authorization: Bearer ${accessToken}" -H "Content-Type: application/json" -d "{\"function\": \"function3\",devMode: true}" ${url}
curl -X POST -H "Authorization: Bearer ${accessToken}" -H "Content-Type: application/json" -d "{\"function\": \"function4\",devMode: true}" ${url}
curl -X POST -H "Authorization: Bearer ${accessToken}" -H "Content-Type: application/json" -d "{\"function\": \"function5\",devMode: true}" ${url}
运行上述脚本,得到如下结果。
{
"done": true,"response": {
"@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse","result": "Function1: Done."
}
}
{
"done": true,"result": "Function2: Done."
}
}
{
"done": true,"result": "Function3: Done."
}
}
{
"done": true,"result": "Function4: Done."
}
}
{
"done": true,"result": "Function5: Done."
}
}
当然,作为测试,您也可以手动运行每个 curl 命令。
注意:
- 在本回答中,假设您已经能够使用 Google Apps Script API 执行 Google Apps Script 项目的功能。请注意这一点。