使用日期戳将数据从一个工作表附加到另一个工作表

时间:2015-04-09 12:58:03

标签: javascript google-apps-script google-sheets

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

我无法实现这一点,你能帮助我吗,因为我是脚本的新手。

  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
      }
}

电子表格-1:电子表格-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

电子表格-2:电子表格-2中的数据,

Date   Name    apple  android   windows    linux

电子表格1中的数据每天都会更改。我想在电子表格1中出现新数据时将数据备份到电子表格-2。这就像每天用日期戳创建数据日志。

2 个答案:

答案 0 :(得分:0)

您需要在数组中添加时间,而不是作为appendrow的另一个参数。即在调用appendRow之前的array.push(time)。如果你希望它成为第一列,或者在数组的开头推送它。
还要看另一个答案,它显示如何优化vy执行单个api调用,但是你需要修改数组才能时间戳。

答案 1 :(得分:0)

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()。即使它现在有效,但是在使用触发器时,稍后添加工作表会使事情变得混乱。