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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:30:59