如何将Gravity Form最新响应同步至Google Sheets另一表格首行?
问题排查与修正方案
核心问题分析
- 初始脚本报错原因:
onChange触发器的e.range仅在INSERT_ROW、EDIT等部分变更类型下存在,当变更类型为OTHER时,e.range是undefined,直接调用e.range.getSheet()会触发"Cannot get properties of undefined"错误。 - 修改后脚本无效果原因:
- 未定义变量
sh,调用sh.getRange()时会静默失败 getLastColumn()未指定所属工作表,属于无效调用- 错误依赖
OTHER类型触发,Gravity Form提交表单时的核心新增行操作对应的变更类型是INSERT_ROW,而非OTHER
- 未定义变量
修正后的脚本
function syncLastResponse(e) { // 仅处理新增行的变更,且目标工作表为"Responses" if (e.changeType !== "INSERT_ROW") return; const sourceSheet = e.range.getSheet(); if (sourceSheet.getName() !== "Responses") return; // 获取最新提交的行数据(新增行即为最后一行) const lastRow = sourceSheet.getLastRow(); const sourceRange = sourceSheet.getRange(lastRow, 1, 1, sourceSheet.getLastColumn()); // 写入到"Last Response"表的第一行 const targetSheet = e.source.getSheetByName("Last Response"); const targetRange = targetSheet.getRange(1, 1, 1, sourceSheet.getLastColumn()); sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES_AND_FORMATTING); }
关键调整说明
- 仅响应
INSERT_ROW类型的变更,这是Gravity Form提交表单时新增响应行的核心触发事件 - 直接通过
sourceSheet.getLastRow()获取最新提交的行,避免依赖e.range.rowStart,逻辑更稳妥 - 明确指定
getLastColumn()的所属工作表,确保获取正确的列数 - 显式指定复制类型(
PASTE_VALUES_AND_FORMATTING),避免不必要的格式或公式冲突
触发器配置注意事项
- 删除之前的旧触发器,重新创建可安装的onChange触发器,关联上述
syncLastResponse函数 - 确保触发器的事件类型选择"更改"(即onChange),不要选"编辑"(onEdit)
内容的提问来源于stack exchange,提问作者Codedabbler
相关产品推荐
相关产品推荐

