时间 table Google sheet

Temporal table Google sheet

我正在使用 google sheet 作为主数据库。 数据被发送并存储到 2 sheets,用户可以在其中与之交互。 用户也可以修改数据。 目标是跟踪 2 sheet 中的所有更改并将更改复制到另一个 sheet 中。 如果 sheet 1 被修改,编辑的行将被复制到 HistoricalSheet 1 并且 sheet 2 也是如此。 当数据被复制时,它会附带一个时间戳和修改 sheet.

的用户 ID

我的问题是检索行范围时未定义。

这是我的代码:

function onEdit(e){
  var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
  var userID = Session.getActiveUser().getUserLoginId();
  var sourceSheet = e.range.getSheet();
  var row = e.range.getRow();
  var rowRange = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn());
  var rowValues = rowRange.getValues()[0];

  if(sourceSheet.getSheetName() == 'Sheet1'){
    var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
    targetSheet.appendRow([timeStamp,userID,rowValues]);
  } else if(sourceSheet.getSheetName() == 'Sheet2'){
    var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
    targetSheet.appendRow([timeStamp,userID,rowValues]);
    }
  }

试试这个:

function onEdit(e){
  const ts = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
  const uid = Session.getActiveUser().getUserLoginId();
  const sh = e.range.getSheet();
  const rg = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn());
  const vs = rg.getValues()[0];
  if(sh.getSheetName() == 'Sheet1'){
    let tsh = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 1');
    tsh.appendRow([ts,uid,vs]);
  } else if(sh.getSheetName() == 'Sheet2'){
    let targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName('HistoricalSheet 2');
    targetSheet.appendRow([ts,uid,vs]);
    }
  }

从您的The onEdit works now based on this link. the issue now that the timestamp, the userid are append but the values is in form of [Ljava.lang.Object;@34c3ed94 in a cell only. The values aren't append to the rest of the row. 回复中,了解到您的My issue is that when retrieving the row range, it is undefined.问题已经解决。

关于您当前的问题,我认为您出现问题的原因是 rowValues 是一个数组。那么在这种情况下,下面的修改呢?

修改后的脚本:

function installedOnEdit(e) {
  var timeStamp = Utilities.formatDate(new Date(), "GMT+8", "hh:mm:ss dd MMMM yyyy")
  var userID = Session.getActiveUser().getUserLoginId();
  var sourceSheet = e.range.getSheet();
  var rowRange = sourceSheet.getRange(e.range.rowStart, 1, 1, sourceSheet.getLastColumn());
  var rowValues = rowRange.getValues()[0];
  var obj = { "Sheet1": "HistoricalSheet 1", "Sheet2": "HistoricalSheet 2" };
  var sheetName = sourceSheet.getSheetName();
  if (!obj[sheetName]) return;
  var targetSheet = SpreadsheetApp.openById('xxxxxxxxxxxxxx').getSheetByName(obj[sheetName]);
  targetSheet.appendRow([timeStamp, userID, ...rowValues]); // targetSheet.appendRow([timeStamp, userID, rowValues.join(",")]);
}
  • 在此修改中,已编辑的行被放入另一个 Spreadsheet 中的规范 sheet,使用对象搜索 sheet 名称。至此,我觉得脚本可以简单一点。
  • 并且,通过targetSheet.appendRow([timeStamp, userID, ...rowValues]),将编辑的行放入一行。
  • 如果要将行值放在一个单元格中,请修改为targetSheet.appendRow([timeStamp, userID, rowValues.join(",")])

注:

  • 本次修改,我将函数名由onEdit修改为installedOnEdit。因为使用SpreadsheetApp.openById时,需要使用可安装的OnEdit触发器。但是,当可安装的 OnEdit 触发器安装到函数 onEdit 时,onEdit 对于简单触发器和具有异步过程的可安装触发器都是 运行。所以,我修改了函数名。所以,请将可安装的OnEdit触发器安装到函数installedOnEdit,并再次测试。

参考文献: