繁体   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