Google表格脚本:如何每天自动复制公式

时间:2018-02-09 19:12:02

标签: javascript google-sheets spreadsheet

希望我能简洁地解释一下。对于我对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一样起作用。即它将新数据附加到电子表格最底部的新行中,感知所有现有行由数组公式填充,即使它们返回的是空白单元格。

关于如何使上述任何一个成为现实的任何想法,或任何完全不同的解决方案,都非常感谢!干杯

1 个答案:

答案 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
}

每天一次自动出问题。

要通过脚本编辑器中的对话框创建触发器,请按以下步骤操作:

  1. 从脚本编辑器中,选择编辑>当前项目的触发器。
  2. 点击以下链接:未设置触发器。点击此处立即添加一个。
  3. 在“运行”下,选择要触发的功能名称。 (应该是记录历史记录)
  4. 在“事件”下,选择“时间驱动”
  5. 选择每天触发的一个,以及您希望它触发的那一天。
  6. 该脚本将以您指定的小时间隔每天自动运行您指定的功能。

    该脚本将查找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
    }