【问题标题】:How to know the progress status of a Google Apps script如何知道 Google Apps 脚本的进度状态
【发布时间】:2021-07-18 11:55:33
【问题描述】:

我创建了一个 Apps 脚本来自动执行多项任务:

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 脚本中使用“全局”函数按顺序执行,该函数允许我检索文件夹的 ID 和创建的 Doc 文档。 我使用 cURL 运行此 Apps 脚本(从终端)。

脚本的持续时间约为 10 秒,我想知道是否有可能获得一条消息(或文本值)作为响应,该消息会随着每个功能的完成而更新。

我在 Internet 和 Stackoverflow 上查看过,但我发现的所有内容都是指在电子表格中使用“flush”命令来更新单元格的值。我需要的是更新终端中的响应消息。

有人可以帮帮我吗?

非常感谢。

沃迪亚姆

【问题讨论】:

  • 我不认为http请求能够在执行过程中返回消息。我认为您可能需要更改方法并调用每个函数,这可能是自动化的,即通过创建 Windows 批处理文件、Power Shell 脚本等。
  • 感谢@Rubén,调用每个函数的选项是我的第二选择,但我希望有一种方法可以在“全局”函数上进行。
  • 我建议您研究一下 http 请求和 REST API 的工作原理。

标签: curl google-apps-script httprequest google-apps-script-api


【解决方案1】:

根据您的以下功能,

功能 1. - 创建一个新文件夹并检索 ID。 功能 2. - 在文件夹中创建 doc 文件的副本。 功能 3. - 替换文档中多个 {{TEXT}} 类型标签的文本。 功能 4. - 在文档中插入图像。 功能 5. - 获取 doc 文档的公共链接。

我认为在您的情况下,可以使用以下 3 种模式。

  1. 所有功能都被视为一个功能。

    • 在这种情况下,您的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 已经提到了这一点。
  2. 在“功能 1”创建新文件夹 ID 时,从该功能返回文件夹 ID,并在“功能 2”中使用文件夹 ID。并且,在复制 Document 时,从函数返回文档 ID,并将其用于“Function 3”、“Function 4”和“Function 5”。

    • 在这种情况下,不需要使用全局变量。为了检索响应,每次使用 curl 命令执行每个函数。但是,在执行每个函数时,需要将每个响应值提供给下一个函数。我认为这可能有点复杂。
  3. 在“功能 1”创建新文件夹 ID 时,将文件夹 ID 放入 PropertiesService,而在运行“功能 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,
  "response": {
    "@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse",
    "result": "Function2: Done."
  }
}
{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse",
    "result": "Function3: Done."
  }
}
{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse",
    "result": "Function4: Done."
  }
}
{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse",
    "result": "Function5: Done."
  }
}

当然,作为测试,你也可以手动运行每个curl命令。

注意:

  • 在这个答案中,假设您已经能够使用 Google Apps Script API 执行 Google Apps Script 项目的功能。请注意这一点。

参考:

【讨论】:

  • 非常感谢@Tanaike 的详细回复。我会按照您的建议使用模式 3。您的脚本非常清晰且运行良好。我还可以选择单独将其用于特定功能。非常感谢;)。
  • @Wardiam 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2021-07-02
相关资源
最近更新 更多