希望我能简洁地解释一下。对于我对Sheets和脚本缺乏了解的人来说,这是一个问题。
所以我每天都有一张使用此脚本的工作表:
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 cells = sheet.getRange("A2:A980");
cells.setNumberFormat("dd/MM/yyyy");
};
它从另一个工作表中获取数据并将其附加到列A,B,C(日期,金额,%)。列D-G包含跟踪B和B中绝对值和%变化的公式。 C随着时间的推移目前我每天都去手动复制那些公式,但是必须有一种自动化的方法吗?大概可能的方法包括以下内容:
1)在脚本中添加内容以复制前一天的公式。这个人写了一些可能会有帮助的东西,但我对编码知之甚少,我甚至无法理解如何将其整合到我现在的剧本中:http://googlescripts.harryonline.net/copy-formulas-down
2)编辑脚本以附加到列A-C,忽略其他列中的任何内容。然后我可以填写D-G中的公式(使用IF(isblank ...))并将它们留在那里。但是,如果我现在这样做,脚本会在D-G列中的所有内容之后的最底部的新行中添加新数据。
3)编辑脚本并使用数组公式?我终于找到了一个按照自己的条件工作的数组公式。但遗憾的是,脚本仍然像上面的问题2一样起作用。即它将新数据附加到电子表格最底部的新行中,感知所有现有行由数组公式填充,即使它们返回的是空白单元格。
关于如何使上述任何一个成为现实的任何想法,或任何完全不同的解决方案,都非常感谢!干杯
答案 0 :(得分:0)
我的理解是这样的。
您希望将从其他工作表获得的值粘贴到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
}