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

Typeform提交触发表格脚本:新响应检测方法技术问询

Typeform同步Google Sheets:onSubmit触发问题与替代方案

嘿,这个场景我帮不少开发者处理过,直接给你梳理清楚:

关于onSubmit触发器的核心结论

Google Sheets的onSubmit触发器(不管是绑定Google表单还是表格本身的)默认不会被Typeform同步的新响应触发。原因很简单:onSubmit是针对「用户手动提交Google表单」或者「在表格内通过内置表单提交」的动作设计的,而Typeform是通过API/集成工具直接后台写入表格行,不属于触发器的触发范畴。

检测新响应的替代方法

这里给你三个实用方案,按实时性和复杂度排序:

1. 利用onChange触发器(接近实时)

Google Apps Script的onChange触发器会在表格发生任何变更时触发,包括新增行。你可以写脚本过滤出「插入行」的操作,针对性处理Typeform的同步数据:

function onChange(e) {
  // 只处理新增行的变更事件
  if (e.changeType === 'INSERT_ROW') {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    // 获取最新新增的行(Typeform同步的内容通常在最后一行)
    const newRow = sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()).getValues()[0];
    
    // 这里写你要执行的业务逻辑,比如发送通知、数据校验等
    console.log('新增Typeform响应:', newRow);
  }
}

注意:需要在Apps Script编辑器手动安装这个触发器(路径:「编辑」→「当前项目的触发器」→ 添加触发器,选择onChange事件,事件源选「从电子表格」)。

2. 时间驱动触发器(定时检查)

如果对实时性要求不高(比如允许5-10分钟延迟),可以设置定时触发器,定期扫描表格新增的行:

function checkNewResponses() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const scriptProperties = PropertiesService.getScriptProperties();
  
  // 获取上次处理记录的行数,默认初始为0
  const lastProcessedRow = parseInt(scriptProperties.getProperty('lastProcessedRow')) || 0;
  const currentLastRow = sheet.getLastRow();
  
  if (currentLastRow > lastProcessedRow) {
    // 获取所有新增的行范围
    const newRows = sheet.getRange(lastProcessedRow + 1, 1, currentLastRow - lastProcessedRow, sheet.getLastColumn()).getValues();
    
    // 遍历处理每一行数据
    newRows.forEach(row => {
      console.log('待处理的新响应:', row);
      // 你的业务逻辑代码
    });
    
    // 更新记录的最新处理行数
    scriptProperties.setProperty('lastProcessedRow', currentLastRow.toString());
  }
}

安装触发器时选择「时间驱动」,设置合适的执行频率(比如每5分钟)即可。

3. 直接用Typeform Webhook(实时最优)

如果可以调整流程,直接给Typeform配置Webhook,当有新响应时直接发送到你的处理服务(比如Google Apps Script部署的Web应用),这是最实时的方案:

  • 在Typeform后台找到目标表单,进入「集成」→「Webhooks」,添加Webhook URL(即你部署的Apps Script Web应用地址)
  • 写一个doPost函数接收Typeform的响应数据:
function doPost(e) {
  const responseData = JSON.parse(e.postData.contents);
  // 直接处理Typeform的原始响应数据
  console.logTypeform新响应详情:', responseData);
  
  // 如果需要同步到Sheets,可手动追加行
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow([
    responseData.response_id,
    responseData.submitted_at,
    responseData.answers[0].text // 示例:取第一个问题的答案
  ]);
  
  return ContentService.createTextOutput('Success').setMimeType(ContentService.MimeType.TEXT);
}

这个方案完全由Typeform的事件驱动,不需要依赖Sheets的触发器,实时性拉满。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:52