Apps Script运行报setMilliseconds is not a function错误求解
报错根因分析
报错触发位置为代码第17行,错误提示TypeError: data[j][0].setMilliseconds is not a function的直接原因是:你从表单响应表读取到的A列(时间戳列)某行的值不是Date类型对象,不存在setMilliseconds原生方法。
该代码2天前可正常运行,是因为此前「Form responses 1」工作表的A列所有值都是Google表单自动写入的标准Date类型时间戳,当前出现异常的常见诱因:
- 手动在A列输入、粘贴过文本/数字类内容,覆盖了表单自动生成的时间戳
- 其他关联脚本、插件近期对A列做过写入操作,将原本的Date对象转换成了纯文本、数字等非Date类型
- 表格自动格式识别异常,某行时间戳被强制转换为纯文本存储
修复方案
在调用setMilliseconds方法前,先对data[j][0]做类型校验和兼容转换,非有效时间的行直接留空即可避免报错,兼容后的完整代码如下:
function assignEditUrls() { var form = FormApp.openById('1PEopT9RzLFv-p5Esm1IXOF_-bzAnlsyzhAJ-qjWNBow'); var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form responses 1'); var data = sheet.getDataRange().getValues(); var urlCol = 237; var responses = form.getResponses(); var timestamps = [], urls = [], resultUrls = []; for (var i = 0; i < responses.length; i++) { timestamps.push(responses[i].getTimestamp().setMilliseconds(0)); urls.push(responses[i].getEditResponseUrl()); } for (var j = 1; j < data.length; j++) { let targetTimestamp = null; // 兼容处理不同类型的时间戳值 if (data[j][0] instanceof Date) { targetTimestamp = data[j][0].setMilliseconds(0); } else if (data[j][0]) { // 若为字符串/数字类型的时间,先转Date对象再处理 const parsedDate = new Date(data[j][0]); if (!isNaN(parsedDate.getTime())) { targetTimestamp = parsedDate.setMilliseconds(0); } } resultUrls.push([targetTimestamp !== null ? urls[timestamps.indexOf(targetTimestamp)] : '']); } sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls); }
额外排查建议
如果修复后仍存在匹配不到编辑链接的行,可直接检查「Form responses 1」表A列对应行的内容,手动修正格式异常的时间戳即可。
内容的提问来源于stack exchange,提问作者Lyce
相关产品推荐
相关产品推荐

