You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作支持单次发票信息输入的Google Form并同步至Google Sheet

Google Form需求实现方案

需求1:用户仅需输入一次发票号和发票日期,其余数据手动输入

完全可以实现,具体操作步骤:

  • 新建Google Form,先添加发票号(单行文本类型)和发票日期(日期类型)两个问题,放在表单最顶端。
  • 点击添加问题的菜单,选择「重复部分」(或「重复段落」),命名为「商品明细」。
  • 在这个重复部分内,依次添加对应字段的问题:
    • 序号(数字/单行文本)
    • 商品名称(单行文本)
    • 数量(数字)
    • 单价(数字)
    • 金额(数字)
  • 用户填写时,只需一次性输入发票号和日期,然后可点击「添加商品明细」按钮,手动输入多组不同的商品数据。

需求2:同步表单结果至Google Sheet,格式与示例表格一致

默认的表单同步会把重复部分的内容横向展开,无法匹配示例的纵向格式,需借助Google Apps Script实现,步骤如下:

  1. 在Google Form的「响应」标签中,点击「链接到表格」,创建新的Google Sheet存储原始响应。
  2. 打开该Sheet,点击「扩展程序」→「Apps Script」,进入脚本编辑器。
  3. 删除默认代码,粘贴以下脚本:
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);
  });
}
  1. 保存脚本(命名为任意名称,如FormResponseFormatter),点击左侧的时钟图标进入触发器设置,添加新触发器:
    • 选择函数:onFormSubmit
    • 事件源:来自表单
    • 事件类型:表单提交
    • 完成后授权脚本所需权限。

设置完成后,用户提交表单时,脚本会自动将发票号、日期与每条商品数据对应,逐行写入「格式化数据」Sheet,格式与示例表格完全一致。

内容的提问来源于stack exchange,提问作者Dimas Rizqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:10:27