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

为何Google Drive的fileLastModified()无法正确获取表单提交时间?

问题:Google Apps Script无法识别表单提交后的表格最新修改时间

我将Google Apps Script绑定到接收表单响应的电子表格中,但收到表单提交后,通过DriveApp.getFileById获取的文件最后修改时间未更新。相关代码及测试结果如下:

function myFunction() {
     var ss = SpreadsheetApp.getActiveSpreadsheet();
     SpreadsheetApp.flush()
     var id = ss.getId();
     var file = DriveApp.getFileById(id);
     var mod = file.getLastUpdated();
     var created = file.getDateCreated();
     Logger.log('mod: %s, created: %s',mod,created);
  }

测试结果:

  • 提交前日志:mod: Wed Aug 09 16:47:44 GMT-07:00 2023, created: Wed Aug 09 16:06:07 GMT-07:00 2023
  • 表单提交记录:8/9/2023 16:50:30 Option 2
  • 提交后日志:mod: Wed Aug 09 16:47:44 GMT-07:00 2023, created: Wed Aug 09 16:06:07 GMT-07:00 2023

通过“文件>文档详情”查看,文件修改时间已更新为16:50,但脚本获取到的修改时间未变化。我原本希望通过修改时间判断是否有新提交来读取响应,现在这个方法会遗漏提交;但调用getLastRow()可以正常检测到新行。请问这是什么原因?


原因及解决方案

核心原因

Drive的文件修改时间和Spreadsheet内部的表单提交更新存在延迟同步问题:

  • 表单提交后,电子表格的单元格数据会立即更新,getLastRow()直接读取表格实时数据状态,所以能立刻感知到新行。
  • 而Drive层面的文件修改时间需要经过Google后台同步流程才会更新,这个同步并非即时,短则几秒长则数分钟,导致脚本调用DriveApp.getFileById(id).getLastUpdated()时,拿到的还是同步前的旧时间。
  • 此外,表单提交属于表格的“内部数据更新”,部分场景下Google不会立刻触发Drive文件的修改时间戳刷新,只有手动编辑表格、修改表格结构(如增删列)这类操作,才会立即同步Drive的修改时间。

替代方案

既然getLastRow()能正常检测新行,直接基于这个逻辑判断新提交更可靠:

  1. 用属性服务记录已处理行号:把上次处理的最后行号存在脚本属性中,每次运行时对比当前getLastRow():
function checkNewSubmissions() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("表单响应 1"); // 替换为你的表单响应表名
  var currentLastRow = sheet.getLastRow();
  var props = PropertiesService.getScriptProperties();
  var lastProcessedRow = props.getProperty("lastProcessedRow") || 0;

  if (currentLastRow > lastProcessedRow) {
    // 处理新提交的行
    var newRows = sheet.getRange(lastProcessedRow + 1, 1, currentLastRow - lastProcessedRow, sheet.getLastColumn()).getValues();
    Logger.log("检测到" + newRows.length + "条新提交");
    // 更新已处理行号记录
    props.setProperty("lastProcessedRow", currentLastRow);
  }
}
  1. 用表单提交触发器直接处理:如果脚本是由表单提交触发(配置onFormSubmit触发器),无需判断修改时间,直接用事件对象处理当前提交:
function onFormSubmit(e) {
  // e.values包含当前提交的所有数据
  var responseData = e.values;
  Logger.log("新提交数据:" + responseData);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:30:13