基于Google Apps Script:如何通过Google表单上传文件的URL在自动回复邮件中附加对应PDF文件?
解决Google Apps Script中通过Drive文件URL获取文件并作为邮件附件的问题
首先,你提到找不到GetFileByURL方法是正常的——Google Apps Script的DriveApp确实没有这个直接方法,但我们可以通过提取文件URL中的文件ID来实现需求,完全不需要让用户手动填写文件名,彻底规避人为错误。
核心思路:从Drive文件URL中提取文件ID
Google Drive中文件的URL通常是以下几种格式之一:
https://drive.google.com/file/d/[FILE_ID]/viewhttps://drive.google.com/open?id=[FILE_ID]https://drive.google.com/uc?id=[FILE_ID]
不管哪种格式,我们都可以用正则表达式提取出中间的[FILE_ID],再通过DriveApp.getFileById(FILE_ID)获取对应的文件对象。
修改后的完整代码
我帮你调整了原代码,添加了提取文件ID的逻辑,替换掉原来依赖文件名的部分:
function onSubmit(e) { var ss = SpreadsheetApp.getActive(); var range = e.range; var row = Number(range.getRow()); var upFolder = DriveApp.getFolderById("ADDRESS OF WHERE THE UPLOADED FILE FROM THE FORM IS"); var formReceived = HtmlService.createTemplateFromFile("HTML Email"); // 获取表单提交的核心数据 var parent_name = ss.getRange('B'+row).getValue(); var parent_email = ss.getRange('C'+row).getValue(); var fileURL = ss.getRange('D'+row).getValue(); // 初始化状态为发送错误 ss.getRange('E'+row).setValue("Error! Email not sent."); // 从Drive URL中提取文件ID的工具函数 function getFileIdFromUrl(url) { // 匹配绝大多数Drive文件链接格式的正则表达式 var match = url.match(/[-\w]{25,}/); return match ? match[0] : null; } var fileId = getFileIdFromUrl(fileURL); if (fileId) { try { var targetFile = DriveApp.getFileById(fileId); // 发送带附件的邮件 MailApp.sendEmail({ to: parent_email, name: parent_name, htmlBody: formReceived.evaluate().getContent(), attachments: [targetFile.getAs(MimeType.PDF)] }); // 更新发送成功的时间戳 var now = new Date(); var timeStamp = Utilities.formatDate(now, 'GMT+8', "YYYY.MM.dd HH:mm:ss"); ss.getRange('E'+row).setValue(timeStamp); // 修正原代码中未定义的ws变量,统一使用ss } catch (error) { // 捕获异常并记录具体错误信息 ss.getRange('E'+row).setValue("Error: " + error.message); } } else { ss.getRange('E'+row).setValue("Error: Invalid file URL"); } }
关键修改点说明
- 新增
getFileIdFromUrl函数:用正则表达式一键提取文件ID,兼容各种Drive文件链接格式,无需依赖用户输入。 - 替换文件获取逻辑:不再使用易出错的
getFilesByName,直接通过提取到的ID调用DriveApp.getFileById获取文件,精准且可靠。 - 增加错误处理机制:添加
try-catch块捕获文件获取或邮件发送时的异常,在Sheet中记录具体错误信息,方便后续排查问题。 - 修正原代码小问题:原代码中使用了未定义的
ws变量,这里统一改为ss(当前活动表格),避免运行报错。
额外提醒
- 权限问题:表单上传的文件默认归属表单所有者,只要脚本运行者是表单/Sheet的所有者,权限通常不会有问题。
- 文件类型校验:如果需要确保只发送PDF文件,可以在获取文件后添加判断:
if (targetFile.getMimeType() === MimeType.PDF),不符合则跳过发送并记录状态。
内容的提问来源于stack exchange,提问作者dracomagmus
相关产品推荐
相关产品推荐

