为了账号安全,请及时绑定邮箱和手机立即绑定

Google Script - 表单:以编程方式处理上传字段:如何获取多个链接?

Google Script - 表单:以编程方式处理上传字段:如何获取多个链接?

料青山看我应如是 2023-05-11 14:08:25
在谷歌脚本中使用上传字段时,我遇到了两个问题。我会尽力描述我的问题。我有一个表单,在发送时设置了触发器。此触发器调用一个主函数,而主函数又调用其他一些函数。其中一个子功能创建一个文档,然后在特定工作表上设置其链接。主函数在以下行中获取项目响应对象:var responses = e.response.getItemResponses();然后,此对象作为参数传递给 Doc 函数:generateBriefingPDF(classID, briefingSheet, responses, timestamp);ClassID 是一个简单的整数属性,briefingSheet 是我从中获取的目标工作表和时间戳:var timestamp = e.response.getTimestamp();在 generateBriefingPDF 脚本中,我得到响应并将它们分配给更易于阅读的变量,如下所示:var name = responses[0].getResponse();var subject = responses[1].getResponse();var content = responses[2].getResponse();var level = responses[3].getResponse();var uploads = responses[4].getResponse();然后,我在用带有变量的模板复制的新文档中替换文本“变量” 。我也将它们设置在工作表中。“上传”var 是文件的 ID,因此我使用以下方法将其转换为链接:uploads = DriveApp.getFileById(uploads).getUrl();这很好用。除了 response[4] 中的“uploads”变量外,它是一个上传字段。发生以下情况:当什么都没有上传时:变量是undefined,所以它不能运行属性“getResponse”。TypeError: Cannot read property 'getResponse' of undefined我在 Stackdriver 日志中收到错误。我试图用以下几行检查是否未定义,但都没有用:if(uploads !== undefined) if(typeof uploads !== "undefined")上传一个文件:一切正常。上传了多个文件:我在尝试通过 ID 获取文件时出错(当然):Exception: Unexpected error while getting the method or property getFileById on object DriveApp. 当我没有将 ID 转换为链接的行时,ID 在doc 文件,但只有第一个出现在工作表中。我能做些什么来解决这两个问题?
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我相信你的目标如下。

  • 您想针对使用 Google 表单上传一个文件和/或多个文件的情况修改您的脚本。

修改点:

根据您的脚本,我认为您的脚本可能是 Google Form 的容器绑定脚本。从 中More than one file is uploaded,我认为uploadsofvar uploads = responses[4].getResponse()是一个包含上传文件的文件 ID 的数组。在这种情况下,responses[4]每种情况如下。

  • 当文件未上传时,responses[4]undefined.

    • 这在你的问题中已经提到了。

  • 当一个文件和/或多个文件上传时,responses[4]是ItemResponse的对象,responses[4].getResponse()是一个包含上传文件的文件ID的数组。

    • 上传一个文件时,var uploads = responses[4].getResponse()就像["###fileId###"]. 在这种情况下,DriveApp.getFileById(uploads)有效。我认为这uploads.toString()可能用于这种情况。但是,当上传多个文件时,文件 ID 不存在。由此,错误发生。

    • 关于 中的问题More than one file is uploaded,我认为这是您问题的原因。

我认为为了实现你的目标,可以使用上述情况。当你的脚本修改后,就变成了下面这样。

修改脚本:

从:

var uploads = responses[4].getResponse();

到:

var uploads = "";

if (responses[4]) {  // or if(uploads !== undefined) if(typeof uploads !== "undefined")

  uploads = responses[4].getResponse().map(id => DriveApp.getFileById(id).getUrl()).join(",");

}

笔记:

在这个修改中,当一个文件被上传时,uploads就是一个URL。例如,当上传 2 个文件时,uploads是一个包含 2 个 URL 的字符串值,例如URL1,URL2. 如果想作为数组使用,请修改为uploads = responses[4].getResponse().map(id => DriveApp.getFileById(id).getUrl()).

当没有文件上传时,uploads是"".


查看完整回答
反对 回复 2023-05-11
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信