无Apps Script经验,能否实现Google Form触发采购表格自动化流程?
需求完全可实现,以下是分步落地方案
一、先完成Google Form创建
搭建符合需求的表单,添加以下字段:
- 姓名(短文本)
- 邮箱(电子邮件类型)
- 交易日期(日期类型)
- 申请金额(数字类型)
- 供应商名称(短文本)
- 团队(下拉菜单,选项和原采购单据里的团队选项保持一致)
- 收据上传(文件上传类型,限制仅允许图片格式)
二、Apps Script 实现流程
- 打开刚创建的Google Form,点击右上角「⋮」>「脚本编辑器」,进入代码编辑界面。
- 替换默认代码为以下脚本(注意替换注释里的占位内容):
function onFormSubmit(e) { // 1. 提取表单提交的所有数据 const itemResponses = e.response.getItemResponses(); // 根据你的表单字段顺序提取值(也可以用字段标题匹配,更稳妥) const submitterName = itemResponses[0].getResponse(); const submitterEmail = itemResponses[1].getResponse(); const transactionDate = itemResponses[2].getResponse(); const amount = itemResponses[3].getResponse(); const supplier = itemResponses[4].getResponse(); const team = itemResponses[5].getResponse(); const receiptFileId = itemResponses[6].getResponse()[0]; // 取上传的第一张收据 // 2. 复制指定的Google Sheet模板 const templateSheetId = "1mZlzeu9-9Mb0B1VmlNSJDfCxELqci4KRc_HFbRt3NwM"; const templateFile = DriveApp.getFileById(templateSheetId); // 格式化日期用于命名,避免特殊字符 const formattedDate = Utilities.formatDate(new Date(transactionDate), Session.getScriptTimeZone(), "yyyy-MM-dd"); const newSheetName = `${team} ${formattedDate} 信用卡申请单`; const copiedFile = templateFile.makeCopy(newSheetName); const newSheet = SpreadsheetApp.openById(copiedFile.getId()).getActiveSheet(); // 3. 填充数据到新表格(根据原单据的实际单元格位置调整) newSheet.getRange("A2").setValue(transactionDate); // 交易日期单元格 newSheet.getRange("B2").setValue(amount); // 申请金额单元格 newSheet.getRange("C2").setValue(supplier); // 供应商名称单元格 newSheet.getRange("D2").setValue(team); // 团队名称单元格 // 设置对应团队的复选框为TRUE(根据原单据的复选框位置调整) switch(team) { case "市场部": newSheet.getRange("E2").setValue(true); break; case "技术部": newSheet.getRange("F2").setValue(true); break; // 其他团队按此格式添加 } // 4. 导出表格为XLSX格式 const xlsxBlob = DriveApp.getFileById(copiedFile.getId()).getAs(MimeType.MICROSOFT_EXCEL); xlsxBlob.setName(`${newSheetName}.xlsx`); // 5. 获取收据图片的Blob对象 const receiptBlob = DriveApp.getFileById(receiptFileId).getBlob(); // 6. 发送邮件 const financeEmail = "finance@yourcompany.com"; // 替换为实际财务邮箱 const subject = `${newSheetName} 申请已提交`; const body = `您好,${submitterName}提交了采购申请,详情见附件。`; MailApp.sendEmail({ to: financeEmail, cc: submitterEmail, subject: subject, body: body, attachments: [xlsxBlob, receiptBlob] }); }
调整脚本细节:
- 字段索引:如果表单字段顺序有变,修改
itemResponses的索引(从0开始计数),或者改用itemResponses.find(item => item.getItem().getTitle() === "字段标题").getResponse()的方式取值,避免顺序变动导致错误。 - 单元格位置:对照原采购单据的单元格位置,修改填充数据和复选框设置的单元格范围。
- 邮箱地址:替换
financeEmail为实际的财务人员邮箱。
- 字段索引:如果表单字段顺序有变,修改
设置触发条件:
- 在脚本编辑器左侧点击「触发器」图标(闹钟样式)>「添加触发器」。
- 配置参数:
- 选择函数:
onFormSubmit - 部署类型:「Head deployments」
- 事件源:「表单」
- 事件类型:「当提交表单时」
- 选择函数:
- 保存后按提示完成授权(需使用有权限的Google账号)。
三、测试与注意事项
- 提交一次测试表单,检查表格复制、数据填充、邮件发送是否正常。
- 确保表单的文件上传字段仅允许图片类型,避免非图片文件导致错误。
- 如果遇到权限报错,确认脚本账号有访问原模板表格、Drive文件以及发送邮件的权限。
内容的提问来源于stack exchange,提问作者ctp1223
相关产品推荐
相关产品推荐

