簡體   English   中英

Google表格腳本:如何每天自動復制公式

[英]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
}

對於每天一次的自動問題。

要通過腳本編輯器中的對話框創建觸發器,請按照下列步驟操作:

  1. 在腳本編輯器中,選擇“編輯”>“當前項目的觸發器”。
  2. 單擊顯示以下鏈接:沒有設置觸發器。 點擊這里,馬上添加一個。
  3. 在“運行”下,選擇要觸發的函數的名稱。 (應該是記錄歷史記錄)
  4. 在“事件”下,選擇“時間驅動”
  5. 選擇一個每天觸發的觸發,並在一天中的哪個小時觸發。

該腳本將以您指定的小時間隔每天自動運行一次您指定的功能。

該腳本將查找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.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM