生成Google Form响应编辑链接的脚本突然失效求助
问题解决:Google Form编辑链接脚本失效修复
报错原因
Google在2022年10月调整了表单响应时间戳在关联表格中的存储格式——原本表格中的时间戳是Date对象,现在改为了字符串类型。原脚本直接对表格中的时间戳调用setMilliseconds()方法,自然触发TypeError。
修复后的脚本
基础修复版(兼容原逻辑)
function FormURLs() { var form = FormApp.openById('__FormID__'); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1'); var data = sheet.getDataRange().getValues(); var urlCol = 2; var responses = form.getResponses(); var timestamps = [], urls = [], resultUrls = []; // 遍历表单响应,收集处理后的时间戳和对应编辑链接 for (var i = 0; i < responses.length; i++) { var responseTs = responses[i].getTimestamp(); responseTs.setMilliseconds(0); timestamps.push(responseTs); urls.push(responses[i].getEditResponseUrl()); } // 遍历表格数据,匹配对应编辑链接 for (var j = 1; j < data.length; j++) { if (!data[j][0]) { resultUrls.push(['']); continue; } // 将表格中的时间字符串转为Date对象并清除毫秒 var sheetTs = new Date(data[j][0]); sheetTs.setMilliseconds(0); // 匹配对应链接 var matchedUrl = urls[timestamps.indexOf(sheetTs)] || ''; resultUrls.push([matchedUrl]); } sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls); }
高效优化版(适合大量响应场景)
当表单响应数量较多时,indexOf的遍历效率较低,可改用对象映射加速匹配:
function FormURLs() { var form = FormApp.openById('__FormID__'); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1'); var data = sheet.getDataRange().getValues(); var urlCol = 2; var responses = form.getResponses(); var timestampUrlMap = {}; var resultUrls = []; // 构建时间戳与编辑链接的映射表(用ISO字符串作为键,避免Date对象匹配问题) for (var i = 0; i < responses.length; i++) { var responseTs = responses[i].getTimestamp(); responseTs.setMilliseconds(0); timestampUrlMap[responseTs.toISOString()] = responses[i].getEditResponseUrl(); } // 遍历表格数据,快速匹配链接 for (var j = 1; j < data.length; j++) { if (!data[j][0]) { resultUrls.push(['']); continue; } var sheetTs = new Date(data[j][0]); sheetTs.setMilliseconds(0); // 从映射表中直接获取对应链接 var matchedUrl = timestampUrlMap[sheetTs.toISOString()] || ''; resultUrls.push([matchedUrl]); } sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls); }
关键修改点
- 将表格中读取的时间字符串通过
new Date()转换为Date对象 - 统一清除时间戳的毫秒部分,避免因毫秒差异导致匹配失败
- 优化版通过对象映射替代数组遍历,提升大数量场景下的执行效率
内容的提问来源于stack exchange,提问作者user19183197
相关产品推荐
相关产品推荐

