将一个 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 也可能会在使用触发器时搞砸。
我写了一个脚本,它必须将数据从一个电子表格复制到另一个电子表格以及日期戳。
我无法实现这个,你能帮我解决这个问题吗,因为我是脚本的新手。
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 也可能会在使用触发器时搞砸。