如何修改Google Apps Script获取Google Form原始提交时间戳?
解决Google表单编辑后时间戳更新导致排序混乱的问题
需求说明
我们用Google Form收集项目需求,数据同步到Google Sheets,并且已经通过脚本生成了表单响应的编辑URL(支持提交后其他人后续编辑)。但现在遇到一个问题:表单被编辑后,Sheets里的时间戳会被更新,导致数月前提交的内容编辑后跑到列表末尾,没办法按原始提交顺序展示数据。需要修改现有脚本,同时实现两个目标:
- 保留生成正确编辑URL的功能
- 获取并存储原始提交时间戳,用来做正确排序
修改方案
核心思路是:新增一个专门存储原始提交时间的列,在第一次生成编辑URL时,从Google Form的响应数据里提取原始提交时间(这个时间不会随编辑改变),写入该列。后续排序就用这个列的值,而非Sheets里被更新的默认时间戳列。
步骤&修改后的代码
- 先在你的Google Sheets表单响应表格里,新增一列,表头命名为
原始提交时间(可以自定义名称,但要和脚本里的变量对应) - 替换原脚本为以下代码:
/* * Global Variables */ // Form URL var formURL = 'https://docs.google.com/forms/d/ID_of_our_Google_Form/edit'; // Sheet name used as destination of the form responses var sheetName = 'Form responses 3'; /* * Name of the column to be used to hold the response edit URLs * It should match exactly the header of the related column, * otherwise it will do nothing. */ var columnName = 'Edit Url' ; // 新增:存储原始提交时间的列名,要和Sheets里的表头完全一致 var columnOriginalTimestamp = '原始提交时间'; // Responses starting row var startRow = 2; function getEditResponseUrls(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); var columnIndex = headers[0].indexOf(columnName); // 新增:获取原始提交时间列的索引 var originalTimestampColIndex = headers[0].indexOf(columnOriginalTimestamp); // 如果找不到编辑URL列或原始时间列,直接终止脚本 if(columnIndex === -1 || originalTimestampColIndex === -1) return; var data = sheet.getDataRange().getValues(); var form = FormApp.openByUrl(formURL); for(var i = startRow-1; i < data.length; i++) { // 只处理有时间戳但还没生成编辑URL的行 if(data[i][0] != '' && data[i][columnIndex] == '') { var timestamp = data[i][0]; var formSubmitted = form.getResponses(timestamp); if(formSubmitted.length < 1) continue; var response = formSubmitted[0]; var editResponseUrl = response.getEditResponseUrl(); // 提取Form里的原始提交时间(不会随编辑改变) var originalSubmitTime = response.getTimestamp(); // 同时写入编辑URL和原始提交时间 sheet.getRange(i+1, columnIndex+1).setValue(editResponseUrl); sheet.getRange(i+1, originalTimestampColIndex+1).setValue(originalSubmitTime); } } }
关键说明
- 脚本只在第一次生成编辑URL时写入原始提交时间,后续编辑不会覆盖这个值,确保原始时间永远准确
response.getTimestamp()是从Google Form的响应记录里直接获取的原始提交时间,和Sheets里被编辑更新的时间戳完全独立- 之后你只需要把Sheets的排序依据改成
原始提交时间列,就能始终按最初的提交顺序展示内容,不受编辑操作影响
内容的提问来源于stack exchange,提问作者Pat Ryan
相关产品推荐
相关产品推荐

