将 Google 表单的初始时间戳附加到记录末尾,以便永久存储创建日期 onFormSubmit

Appending initial timestamp from Google Form to end of record in order to permanently store create date onFormSubmit

我需要能够存储(通过附加到记录)google 表单响应的创建日期,其中在编辑表单时初始时间戳不会被覆盖。此表单托管在 Google 上,位于 Google Apps for Business 环境中。

此信息存在,但在某些时候会在表单更新时被转储。这似乎对使用 Google 表单的人有广泛的应用,这些表单在创建后出于分析目的进行编辑。

这个 Google Docs Forum 解释了一个与我的情况非常相似的情况,但没有包括他们使用的代码。

我浏览了 google 开发人员网站并确定我应该实现此功能的最佳方式是在响应传播 sheet 上使用 onFormSubmit 触发器而不是表单本身,因为我要引用的字段(时间戳)在写入 google sheet 之前是不可选择的,因为无论如何我都想将结果存储在 spreadsheet 的新列中。

我尝试引用 this solution 并出于我的目的进行修改,因为它是我发现的最接近我要解决的问题的代码片段。

下面是我的注释代码。虽然,有些事情我仍然需要解决,例如我的 if else 和我对 createDateColumn 的硬编码,但我能够在没有这些的情况下将其设置为 运行(在 Google App 中使用 运行 菜单脚本链接到 spreadsheet) 但由于某种原因它应该写入时间戳的单元格现在在脚本执行后具有 "Range" 的值所以我假设我设置的值不正确。

我也尝试在表单中添加一个新条目,但是 onFormSubmit 没有自行执行,因此可能还有其他未解决的问题。

感谢任何帮助。我的编码技术有点生疏。

    function onFormSubmit(e) 
{
  var ss = SpreadsheetApp.getActiveSheet();

  var lastRowInx = ss.getLastRow(); // Get the row number of the last row with content
  var createDateColumn = 50; //CreateDateColumn is currently in AX (Column 50) Possibly find named range since hardcoded isn't ideal. LastColumn doesn't work because some responses not required

//  if () condition should be ss.getRange(lastRowInx, createDateColumn) == ""; so that subsequent edits to Google Form which trigger timestamp updates don't overwrite original create date
  //{
    var timestamp = ss.getRange(lastRowInx, 1); // Get timestamp entry
    var createDate = ss.getRange(lastRowInx, createDateColumn);
    createDate.setValue(timestamp);
  //}
  //else {} //should be do nothing
}

****更新**** 有用!感谢您的帮助@Sandy。

为了解决我之前提到的其他问题,我还模块化了代码,因为我在 FormSubmit 上执行一些其他任务,我希望能够在另一个函数中使用 createDate。注意:我已经从代码片段中删除了其他功能,因为它们不适用于该问题。

我还使用了 getMaxColumns() 而不是对列号进行硬编码。

这是供未来用户使用的更新代码

function onFormSubmit(e) 
{
 var ss = SpreadsheetApp.getActiveSheet();
 var lastRowInx = ss.getLastRow(); // Get the row number of the last row with content
 var createDateColumn = ss.getMaxColumns(); //CreateDateColumn is currently in AX (Column 50) which is the last/max column position

  var createDate = setCreateDate(ss, lastRowInx, createDateColumn);
}//This is the end of onFormSubmit
function setCreateDate(ss, lastRowInx,createDateColumn) // Stores the create date timestamp in Column AV on the backend
{
  if (ss.getRange(lastRowInx, createDateColumn).getValue() == "") // so that subsequent edits to Google Form which trigger timestamp updates don't overwrite original create date
  {
    var timestamp = ss.getRange(lastRowInx, 1).getValue(); // Get timestamp entry which is currently in A (Column 1)
    var setDate = ss.getRange(lastRowInx, createDateColumn);
    var createDate = new Date(timestamp);
    setDate.setValue(createDate).setNumberFormat("MM/dd/yyyy hh:mm:ss");
  }
  else {} //should do nothing
  return createDate;
}//This is the end of setCreateDate function

改变这个:

var timestamp = ss.getRange(lastRowInx, 1);

收件人:

var timestamp = ss.getRange(lastRowInx, 1).getValue();

现在,这是一个范围。