【问题标题】:Calling a Google App Script function using the API and cURL使用 API 和 cURL 调用 Google App 脚本函数
【发布时间】:2021-04-10 19:17:03
【问题描述】:

如果这个问题太简单,我深表歉意,但我是使用 cURL 的新手。我在 Google App Script 中创建了一个函数来合并来自两个 Google Docs 的文本。函数是这样的:

function mergeGoogleDocs(doc1, doc2) {

var BaseDoc = DocumentApp.openById(doc1);
var body = BaseDoc.getActiveSection();

var otherBody = DocumentApp.openById(doc2).getActiveSection();
var totalElements = otherBody.getNumChildren();
for( var j = 0; j < totalElements; ++j ) {
var element = otherBody.getChild(j).copy();
var type = element.getType();
if( type == DocumentApp.ElementType.PARAGRAPH )
  { 
  body.appendParagraph(element); 
  }
else if( type == DocumentApp.ElementType.TABLE )
{
body.appendTable(element);
}
else if( type == DocumentApp.ElementType.LIST_ITEM )
{
body.appendListItem(element);
}
else
{
throw new Error("Error de Formato: "+type);
}
}

}

我已经测试了脚本,如果我输入两个文档 ID,它就可以完美运行。我希望能够使用 cURL 从 Google 外部调用此函数。为此,我启用了所有必要的(凭据、范围权限、项目编号并将其实现为可执行 API)。我一直在寻找一种使用 cURL 运行该函数的方法,并且只在这个 post 中找到了这个:

curl -X POST -L \
    -H "Authorization: Bearer ### access token ###" \
    -H "Content-Type: application/json" \
    -d "{function: '### function name ###',devMode: true}" \
    "https://script.googleapis.com/v1/scripts/### script ID ###:run"

我需要包含两个document_IDs 作为参数,因此根据上一篇文章中的信息我创建了以下序列:

curl -X POST -L \
-H 'Authorization: Bearer ##access token##' \
-H "Content-Type: application/json" \
-d '{"function": "##function name##", "parameters": {"doc1":"##docID1##,"doc2":"##docID2##"}, devMode: true}' \ 
"https://script.googleapis.com/v1/scripts/### script ID ###:run"

但是当我运行该序列时,我收到以下错误消息:

{
  "done": true,
  "error": {
    "code": 3,
    "message": "ScriptError",
    "details": [
      {
        "@type": "type.googleapis.com/google.apps.script.v1.ExecutionError",
        "scriptStackTraceElements": [
          {
            "function": "##function name##",
            "lineNumber": 3
          }
        ],
        "errorMessage": "Exception: Document is missing (perhaps it was deleted, or you don't have read access?)",
        "errorType": "ScriptError"
      }
    ]
  }
}

有人可以帮我正确放置序列以使应用脚本正常工作吗?

非常感谢。

沃迪亚姆

【问题讨论】:

  • 首先,很抱歉我的回答对您的情况没有用处。我有一个问题要问你的问题。不幸的是,来自I don't know if it will work,我无法理解您当前的问题。我为我糟糕的英语水平道歉。我能问一下您当前问题的详细信息吗?
  • 我正在 Xojo 中开发一个 Web 应用程序,并使用 libcURL 与 Google Drive 进行通信。我有一个文件夹(“模板”),其中包含几个用作模板的 Google 文档。根据用户的选择,我需要合并其中的 2 个文档。由于我无法直接从 cURL 执行此任务,因此我想在 App Script 中使用此函数来组合文档,但我需要使用 cURL 从 Xojo 调用该函数,因此我正在寻求帮助。
  • 感谢您回复并添加更多信息。从您更新的问题中,我提出了一个答案。你能确认一下吗?如果这不是您期望的方向,我深表歉意。
  • 非常感谢 Tanaike,这正是我所需要的。最后我使用了你的第一个 cURL 命令(修改后的 cURL)

标签: curl google-apps-script


【解决方案1】:

我相信你的目标和你目前的情况如下。

  • 您想将 ##docID1####docID2## 的值赋予 Google Apps 脚本项目中的 mergeGoogleDocs(doc1, doc2) 函数。
  • 您想使用 CURL 命令运行函数。
  • 在您的情况下,在 Google Apps Script API 中使用“scripts.run”方法的准备工作已经完成。
  • 您的 Google Apps 脚本运行良好。

修改点:

  • 为了给function mergeGoogleDocs(doc1, doc2) {} 提供2 个参数,请将##docID1####docID2## 的值赋给parameters 的数组,如"parameters": ["##docID1##", "##docID2##"]。在这种情况下,当使用 "parameters": ["##docID1##", "##docID2##"] 时,数组的每个元素都对应于 Google Apps 脚本中函数的每个参数。
  • 例如,您要将##docID1####docID2##的值作为mergeGoogleDocs(doc1, doc2)的参数传递给函数,请设置"parameters": ["##docID1##", "##docID2##"]这样的值。
  • 顺便说一句,在您的第二个 curl 命令中,当使用 {"doc1":"##docID1##,"doc2":"##docID2##"} 时,"##docID1## 没有被括起来。

当以上几点反映到你的 curl 命令时,它变成如下。

修改 curl 命令:

curl -X POST \
-H 'Authorization: Bearer ### access token ###' \
-H "Content-Type: application/json" \
-d '{"function": "##function name##", "parameters": ["##docID1##", "##docID2##"], devMode: true}' \
"https://script.googleapis.com/v1/scripts/### script ID ###:run"

注意:

  • 当你想使用{"doc1":"##docID1##","doc2":"##docID2##"}作为弧度时,你也可以使用下面的curl命令。

      curl -X POST \
      -H 'Authorization: Bearer ### access token ###' \
      -H "Content-Type: application/json" \
      -d '{"function": "##function name##", "parameters": [{"doc1":"##docID1##","doc2":"##docID2##"}], devMode: true}' \
      "https://script.googleapis.com/v1/scripts/### script ID ###:run"
    
    • 在这种情况下,请在 Google Apps Script 端修改您的脚本,如下所示。

      • 来自

          function mergeGoogleDocs(doc1, doc2) {
        
      •   function mergeGoogleDocs({doc1, doc2}) {
        
  • 当参数只有一个时,似乎可以使用"parameters": "value"。即我确认"parameters": "value"的结果和"parameters": ["value"]的结果是一样的。

参考:

【讨论】:

  • 非常感谢 Tanaike,这正是我所需要的。最后我使用了你的第一个 cURL 命令(修改后的 cURL)
  • @Wardiam 欢迎。谢谢你让我知道。我很高兴你的问题得到了解决。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多