如何制作支持单次发票信息输入的Google Form并同步至Google Sheet
Google Form需求实现方案
需求1:用户仅需输入一次发票号和发票日期,其余数据手动输入
完全可以实现,具体操作步骤:
- 新建Google Form,先添加发票号(单行文本类型)和发票日期(日期类型)两个问题,放在表单最顶端。
- 点击添加问题的菜单,选择「重复部分」(或「重复段落」),命名为「商品明细」。
- 在这个重复部分内,依次添加对应字段的问题:
- 序号(数字/单行文本)
- 商品名称(单行文本)
- 数量(数字)
- 单价(数字)
- 金额(数字)
- 用户填写时,只需一次性输入发票号和日期,然后可点击「添加商品明细」按钮,手动输入多组不同的商品数据。
需求2:同步表单结果至Google Sheet,格式与示例表格一致
默认的表单同步会把重复部分的内容横向展开,无法匹配示例的纵向格式,需借助Google Apps Script实现,步骤如下:
- 在Google Form的「响应」标签中,点击「链接到表格」,创建新的Google Sheet存储原始响应。
- 打开该Sheet,点击「扩展程序」→「Apps Script」,进入脚本编辑器。
- 删除默认代码,粘贴以下脚本:
function onFormSubmit(e) { const response = e.response; const itemResponses = response.getItemResponses(); let invoiceNumber = ''; let invoiceDate = ''; const sectionItems = {}; // 提取固定字段和重复的商品明细数据 itemResponses.forEach(itemResp => { const itemTitle = itemResp.getItem().getTitle(); if (itemTitle === '发票号') { invoiceNumber = itemResp.getResponse(); } else if (itemTitle === '发票日期') { invoiceDate = itemResp.getResponse(); } else { const [sectionName, fieldName] = itemTitle.split(' - '); if (!sectionItems[sectionName]) sectionItems[sectionName] = []; const fieldValues = itemResp.getResponse(); if (Array.isArray(fieldValues)) { fieldValues.forEach((val, idx) => { if (!sectionItems[sectionName][idx]) sectionItems[sectionName][idx] = {}; sectionItems[sectionName][idx][fieldName] = val; }); } } }); // 获取或创建格式化数据的Sheet const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('格式化数据') || SpreadsheetApp.getActiveSpreadsheet().insertSheet('格式化数据'); // 首次运行添加表头 if (targetSheet.getLastRow() === 0) { const headers = ['发票号', '发票日期', '序号', '商品名称', '数量', '单价', '金额']; targetSheet.appendRow(headers); } // 逐行写入格式化后的数据 const productList = sectionItems['商品明细'] || []; productList.forEach(product => { const rowData = [ invoiceNumber, invoiceDate, product['序号'] || '', product['商品名称'] || '', product['数量'] || '', product['单价'] || '', product['金额'] || '' ]; targetSheet.appendRow(rowData); }); }
- 保存脚本(命名为任意名称,如
FormResponseFormatter),点击左侧的时钟图标进入触发器设置,添加新触发器:- 选择函数:
onFormSubmit - 事件源:来自表单
- 事件类型:表单提交
- 完成后授权脚本所需权限。
- 选择函数:
设置完成后,用户提交表单时,脚本会自动将发票号、日期与每条商品数据对应,逐行写入「格式化数据」Sheet,格式与示例表格完全一致。
内容的提问来源于stack exchange,提问作者Dimas Rizqi
相关产品推荐
相关产品推荐

