将一个 sheet 中的数据附加到另一个带有日期戳的数据

Append data from one sheet to another with date stamp

我写了一个脚本,它必须将数据从一个电子表格复制到另一个电子表格以及日期戳。

我无法实现这个,你能帮我解决这个问题吗,因为我是脚本的新手。

  function triggerOnTime() {
  var SpreadSheetKeyA = "MY key";
  var SpreadSheetKeyB = "MY key";
  var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getActiveSheet();
  var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getActiveSheet();
  var data = sheet1.getRange(5,11,10,5).getValues();
  var time = new Date ();
  var array = [];
  for (var y = 1; y < data.length; y++) {

    for (var x = 0; x < 5; x++){
      array.push(data[y][x]);
    }
      sheet2.appendRow([time,array]);
      array = []; //reset the array contents
      }
}

Spreadsheet-1:Spreadsheet-1 中存在数据,

Name     apple  android   windows    linux
Germany    3      4         6          7
America    4      1         6          2
Sweden     1      6         1          6
Paris      5      0         2          4

Spreadsheet-2:数据出现在 Spreadsheet-2 中,

Date   Name    apple  android   windows    linux

电子表格 1 中的数据每天都在变化。每当 spreadsheet-1 中出现新数据时,我想将数据备份到 spreadsheet-2。这就像每天创建一个带有日期戳的数据日志。

您需要将时间添加到数组中,而不是作为附加行的另一个参数。 IE。 array.push(time) 在调用 appendRow 之前。或者,如果您希望它成为第一列,则将它推到数组的开头。
另请参阅另一个答案,该答案显示了如何优化 vy 执行单个 api 调用,但您需要修改数组以具有时间戳。

function triggerOnTime() {
  var SpreadSheetKeyA = "MY key";
  var SpreadSheetKeyB = "MY key";
  var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getSheetByName("Source Name");
  var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getSheetByName("Target Name");
  var data = sheet1.getRange(5,11,10,5).getValues();
  var time = new Date ();
  for (var r = 0; r < data.length; r++) {
    data[r].unshift(time);
    sheet2.appendRow(data[r]);
    }
}

数据[r].unshift(时间);在附加到 sheet2.

之前将时间添加到行数组的开头

如果在脚本的每个 运行 中对 sheet2 进行大量添加,则不应在循环内使用 appendRow() 并且应修改数组然后添加sheet2 一次操作如下

function triggerOnTime() {
  var SpreadSheetKeyA = "MY key";
  var SpreadSheetKeyB = "MY key";
  var sheet1 = SpreadsheetApp.openById(SpreadSheetKeyA).getSheetByName("Source Name");
  var sheet2 = SpreadsheetApp.openById(SpreadSheetKeyB).getSheetByName("Target Name");
  var data = sheet1.getRange(5,11,10,5).getValues();
  var time = new Date ();
  for (var r = 1; r < data.length; r++) {
    data[r].unshift(time);
    }
  sheet2.insertRowsAfter(sheet2.getLastRow(), data.length);
  sheet2.getRange(sheet2.getLastRow()+1, 1, data.length, data[0].length).setValues(data);
}

您应该使用 getSheetByName() 而不是 getActiveSheet()。即使它现在可以工作,稍后添加 sheet 也可能会在使用触发器时搞砸。