如何使用 Google App Script 通过 POST 请求发送文件

How to use Google App Script to send a file using POST request

提问人:user3347814 提问时间:10/20/2023 最后编辑:Rubénuser3347814 更新时间:10/21/2023 访问量:99

问:

我想使用 Google Apps 脚本将 Google 表格与 API 集成

以下是 API 服务中的文档:

curl --location --request POST 'https://apinew.socialhub.pro/api/sendMessage' \
--form 'api_token="SEU API_TOKEN AQUI"' \
--form 'phone="NUMERO DESTINO"' \
--form 'file=@"DIRETÓRIO DO ARQUIVO"' \
--form 'message="MENSAGEM"'

我设法在Google App Script中创建了一个完美运行的脚本:

function send_message_teste(telephone,message) {
  var url = "https://apinew.socialhub.pro/api/sendMessage";
  
  telephone = telephone.toString();
  
  let request = {
                  "api_token":"MY_TOKEN",
                  "phone":telephone,
                  "message":message
                };
                
  let resquest_body = JSON.stringify(request);

  let config = {
    muteHttpExceptions: true,
    method: "post",
    headers: {
      "Content-Type": "application/json"
    },
    payload:resquest_body
  };
               

  let response = UrlFetchApp.fetch(url, config);
  var data = JSON.parse(response.getContentText());
  
  return response
}

我的问题是我无法用文件进行这项工作。API 文档只有 curl 示例。我设法将此示例转换为 Google App Script,但是在尝试通过 API 发送文件时遇到了困难。谁能帮我?

javascript google-apps-script google-drive-api http-post urlfetch

评论

1赞 PatrickdC 10/21/2023
您是否尝试过在应用程序脚本中使用方法,而不是因为您要做的是发送文件而不是获取文件?它已经在您的邮递员代码中。postget
0赞 user3347814 10/21/2023
当我使用或“postfile”参数时,API 似乎可以工作。但是当我尝试发送参数时,它不起作用。错误与 或 相同。get, when I am not trying to use the filepostget
1赞 PatrickdC 10/21/2023
在将文件添加到您的请求之前,您是否尝试过将文件转换为 ?blobpost
0赞 user3347814 10/21/2023
我做了。。。但是我在请求对象中传递了文件。有人建议将其发送到另一个对象中。我会尝试一下,看看会发生什么。

答:

3赞 Tanaike 10/21/2023 #1

我相信你的目标如下。

  • 您希望将以下 curl 命令转换为 Google Apps 脚本。

    curl --location --request POST 'https://apinew.socialhub.pro/api/sendMessage' \
    --form 'api_token="SEU API_TOKEN AQUI"' \
    --form 'phone="NUMERO DESTINO"' \
    --form 'file=@"DIRETÓRIO DO ARQUIVO"' \
    --form 'message="MENSAGEM"'
    

我以为当我看到你的 curl 命令时,请求是.但是,在显示脚本中,该值似乎是发送的 ad JSON 数据。我认为这可能是您当前问题的原因。当这反映在示例脚本中时,以下示例脚本怎么样?multipart/form-data

示例脚本:

请将 Google 云端硬盘上文件的文件 ID 设置为 。fileId

function send_message_teste(telephone,message) {
  const fileId = "###"; // Please set your file ID of the file you want to upload.

  var url = "https://apinew.socialhub.pro/api/sendMessage";
  telephone = telephone.toString();
  let request = {
    "api_token": "MY_TOKEN",
    "phone": telephone,
    "message": message
  };
  const payload = { ...request, file: DriveApp.getFileById(fileId).getBlob() };
  let config = { muteHttpExceptions: true, payload };
  let response = UrlFetchApp.fetch(url, config);
  var data = JSON.parse(response.getContentText());
  return response;
}
  • 如果包含,则自动使用 POST 方法。payload

注意:

  • 我认为这个修改后的脚本的请求与上面的 curl 命令相同。但是,如果发生错误,请再次确认 和 的值。requestfileId

  • 如果您的 API 中无法使用此修改后的脚本的结构,则可以使用此 Google Apps 脚本库。参考文献(作者:我)multipart/form-data

参考:

评论

0赞 user3347814 10/21/2023
我知道这可能是一个愚蠢的问题,但你把它放在变量之前有什么作用?......request
0赞 user3347814 10/21/2023
顺便说一句,您的代码运行良好!!!!!!!!!!!!!!!!!!!!!!!!!非常感谢!!!!我仍然不明白运算符到底是做什么的,但代码有效!...
3赞 TheMaster 10/21/2023
@user3347814 这是一个点差运算符。您可以在 mdn 中查找它。
1赞 Tanaike 10/21/2023
@user3347814 感谢您的回复和测试。我很高兴您的问题已得到解决。也谢谢你。
1赞 Tanaike 10/22/2023
@user3347814 关于,是的。例如,当有 时,变为 。in this case, is it the same thing as adding another key to the object?const a = {key1: "value1", key2: "value2"}const res = {...a, "key3": "value3"}{key1: "value1", key2: "value2", "key3": "value3"}