首页 文章

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

提问于
浏览
0

希望我能简洁地解释一下 . 对于我对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&C随时间的绝对值和%变化的公式 . 目前我每天都去手动复制那些公式,但是必须有一种自动化的方法吗?推测可能的方法包括以下内容:

1)在脚本中添加一些东西以复制前一天的公式 . 这家伙写的东西可能有所帮助,但我对编码知之甚少,甚至无法理解如何将其整合到我现在的脚本中:http://googlescripts.harryonline.net/copy-formulas-down

2)编辑脚本以附加到列A-C,忽略其他列中的任何内容 . 然后我可以填写D-G中的公式(使用IF(isblank ...))并将它们留在那里 . 但是,如果我现在这样做,脚本会在D-G列中的所有内容之后的最底部的新行中添加新数据 .

3)编辑脚本并使用数组公式?我终于找到了一个按照自己的条件工作的数组公式 . 但遗憾的是,脚本仍然像上面的问题2一样起作用 . 即它将新数据添加到电子表格最底部的新行中,感知所有现有行由数组公式填充,即使它们返回的是空白单元格 .

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

1 回答

  • 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
    }
    

相关问题