
[英]How to refresh the results of custom formulas automatically in Google Sheets?
[英]Google Sheets script: how to automatically copy down formulas each day
希望我能簡要解釋一下。 對我對表格和腳本的了解不足的人來說,這是個問題。
因此,我每天有一次使用此腳本的工作表:
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列(日期,金額,%)。 DG列包含跟蹤B和C隨時間變化的絕對值和百分比變化的公式。 目前,我每天都手動復制這些公式,但是必須有一種自動化的方法? 可能的方法包括:
1)在腳本中添加一些內容,以復制前一天的公式。 這個人寫了一些可能有幫助的東西,但是我對編碼了解甚少,我什至不知道如何將其集成到我現在的腳本中: http : //googlescripts.harryonline.net/copy-formulas-down
2)編輯腳本以追加到AC列,而忽略其他列中的任何內容。 然后,我可以填寫DG中的公式(使用IF(isblank ...))並將其保留在那里。 但是,如果現在執行此操作,該腳本會將新數據追加到DG列中的所有內容之后的最底部的新行中。
3)編輯腳本並使用數組公式? 我終於得出了一個可以按自己的條件工作的數組公式。 但是可悲的是,腳本仍然像上面的問題2一樣起作用。 也就是說,它將新數據追加到電子表格最底部的新行中,即使數組返回的是空白單元格,也可以感知到所有現有的行都將由數組公式填充。
任何有關如何實現上述目標的想法,或任何完全不同的解決方案,都應得到極大的贊賞! 干杯
我的理解是這樣。
您希望將從另一張紙上獲得的值粘貼到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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.