为何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()能正常检测新行,直接基于这个逻辑判断新提交更可靠:
- 用属性服务记录已处理行号:把上次处理的最后行号存在脚本属性中,每次运行时对比当前
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); } }
- 用表单提交触发器直接处理:如果脚本是由表单提交触发(配置
onFormSubmit触发器),无需判断修改时间,直接用事件对象处理当前提交:
function onFormSubmit(e) { // e.values包含当前提交的所有数据 var responseData = e.values; Logger.log("新提交数据:" + responseData); }
内容的提问来源于stack exchange,提问作者higlider
相关产品推荐
相关产品推荐

