自定义表单提交时用Google Script获取Drive文件链接写入Sheet
问题核心原因
你当前的表单输入框#upload_MC默认存储的是本地文件名,提交给Google Form时自然只会把文件名写入关联Sheet。只要将文件上传完成后拿到的Drive访问链接回填到这个输入框,就能实现你的需求。
所需修改的代码
1. 修改 Page.html 的JS逻辑
找到uploadMC函数中的fetch请求部分,在拿到返回结果后将Drive链接回填到输入框,同时可增加提交按钮状态控制避免未上传完成就提交:
function uploadMC(){ const file = form.file.files[0]; // 上传过程中禁用提交按钮 document.getElementById('submit').disabled = true; const fr = new FileReader(); fr.readAsArrayBuffer(file); fr.onload = (f) => { const url = "https://script.google.com/macros/s/###/exec"; //替换为你的Web Apps URL const qs = new URLSearchParams({ filename: file.name, mimeType: file.type, }); fetch(`${url}?${qs}`, { method: "POST", body: JSON.stringify([...new Int8Array(f.target.result)]), }) .then((res) => res.json()) .then((fileUrl) => { // 将拿到的文件链接回填到表单输入框,替换原有文件名 document.getElementById('upload_MC').value = fileUrl; // 上传完成恢复提交按钮 document.getElementById('submit').disabled = false; }) .catch((err) => { console.log(err); document.getElementById('submit').disabled = false; alert('文件上传失败,请重试'); }); }; }
2. 修改 Code.gs 增加文件权限配置
默认上传的文件只有你自己可以访问,需要新增权限配置让所有拿到链接的人都能查看文件:
function doGet(e){ return HtmlService.createTemplateFromFile("page").evaluate().addMetaTag("viewport", "width=device-width, initial-scale=1.0"); } function doPost(e) { const folderId = "###"; // 替换为你的目标文件夹ID const blob = Utilities.newBlob( JSON.parse(e.postData.contents), e.parameter.mimeType, e.parameter.filename ); const file = DriveApp.getFolderById(folderId || "root").createFile(blob); // 新增:设置文件权限为「所有知道链接的人可查看」 file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); const responseObj = file.getUrl(); return ContentService.createTextOutput( JSON.stringify(responseObj) ).setMimeType(ContentService.MimeType.JSON); }
验证步骤
修改完成后重新部署Web App(注意部署版本号要更新),上传文件后可以看到输入框内原本的文件名会变成https://drive.google.com/...开头的链接,提交表单后关联的Sheet里就会直接写入这个访问链接。
内容的提问来源于stack exchange,提问作者Eliza Matthew
相关产品推荐
相关产品推荐

