我的理解是这样的。
您希望将从另一张工作表中获得的值粘贴到 A 列的第一个空行上(因为如果 A 有值,那么 B 和 C 也有值)。这也应该每天自动完成一次。
function getFirstEmptyRow() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('History');
var values = sheet.getRange('A:A').getValues();
var firstEmptyRow = values.filter(String).length +1; // filter out all non-string entries and get its length+1 (first empty row)
return firstEmptyRow
}
此函数将第一个空行作为 A 列的整数(数字)返回。
您的新代码应如下所示
function recordHistory() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("History");
var source = sheet.getRange("A2:C2");
var values = source.getValues();
values[0][0] = new Date();
// sheet.appendRow(values[0]);
var firstEmptyRow = getFirstEmptyRow();
sheet.getRange(firstEmptyRow, 1, 1, values[0].length).setValues(values);
var cells = sheet.getRange("A2:A980");
cells.setNumberFormat("dd/MM/yyyy");
};
function getFirstEmptyRow() {
var sheet = SpreadsheetApp.getActiveSheet().getSheetByName('History');
var values = sheet.getRange('A:A').getValues();
var firstEmptyRow = values.filter(String).length +1; // filter out all non-string entries and get its length+1 (first empty row)
return firstEmptyRow
}
对于每天一次的自动问题。
要通过脚本编辑器中的对话框创建触发器,请按以下步骤操作:
- 从脚本编辑器中,选择编辑 > 当前项目的触发器。
- 单击显示:未设置触发器的链接。点击此处立即添加。
- 在运行下,选择要触发的函数名称。 (应该是记录历史)
- 在事件下,选择时间驱动
- 选择每天触发的以及您希望在一天中的哪个时间触发。
脚本将按照您指定的时间间隔每天自动运行一次您指定的函数。
脚本将查找 A 列的第一个空行,并将该行的 A、B 和 C 列的值设置为 'values[0]' 中的值。
这也允许您只用您想要的任何公式填充剩余的列,而不会覆盖它们或将值附加到工作表的底部。
请注意,尽管我指定的 getFirstEmptyRow 函数(我使用的)速度很快但相当笨拙。例如,它不考虑中间是否有空行。这将使它覆盖最后一个条目(如果只有一个间隙)。
如果 A 列中总是有一个值,那么这不是问题,如果有差距,请使用下面的代码。
function recordHistory() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("History");
var source = sheet.getRange("A2:C2");
var values = source.getValues();
values[0][0] = new Date();
// sheet.appendRow(values[0]);
var firstEmptyRow = getFirstEmptyRow();
sheet.getRange(firstEmptyRow, 1, 1, values[0].length).setValues(values);
var cells = sheet.getRange("A2:A980");
cells.setNumberFormat("dd/MM/yyyy");
};
function getFirstEmptyRow() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('History');
var values = sheet.getRange('A:A').getValues();
var valuesLength = values.length;
var i;
var firstEmptyRow;
for (i = 0; i < valuesLength; i++) {
if (values[i] != '') {
firstEmptyRow = i +1 // Because index starts from 0 and not 1
}
}
return firstEmptyRow + 1 // +1 because the above forloop assigns the last row as the last row containing a value
}