Google脚本-更新/查找和替换复制工作表中的引用

时间:2019-07-28 16:24:04

标签: google-apps-script google-sheets

我制作了一个脚本,用于复制电子表格的最后一张纸并将其指定为当前日期,即“ 2019年7月28日”。

现在,这些工作表中有数十个公式引用了日期之前的日期进行计算,我需要它们自动更新以及手动更改所有引用对于过程而言过于繁琐。其中有80多个。

在Excel中,我已经能够解决此问题,只需添加一个函数即可,该函数可以通过替换方法比较给定数据范围内的名称,从而将两天前工作表的每次出现替换为一天前的工作表在VBA中。现在,我需要在Google脚本中执行相同的操作,但在Google脚本文档中找不到类似的方法。

有人知道该怎么做吗?搜索该问题并没有带来太大帮助。为了说明起见,我将下面在VBA中使用的代码包括在内。

Public Sub FormulaUpdate()

to_replace = ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.count - 2).name
replace_val = ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.count - 1).name

range("D2:D100").Replace What:=to_replace, Replacement:=replace_val, LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

range("G45:G54").Replace What:=to_replace, Replacement:=replace_val, LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

End Sub

1 个答案:

答案 0 :(得分:0)

尝试以下代码:

lastrow获取包含A的数据的最后一行(我以该列为示例,所有日期都存储在此处),而col_A获取A2的数据(A1为标题)我们之前得到的最后一行。

function main() {

  var sprsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sprsheet.getActiveSheet();
  var lastrow = "A" + (sheet.getLastRow());
  var col_A = sheet.getRange('A2:'+lastrow).getValues();

  var yesterday = getYesterday();
  var twoDaysAgo = deduceTwodays();

  for (var i = 0; i < col_A.length;i++){
    if (col_A[i] == twoDaysAgo){
      sheet.getRange("A"+(i+2)).setValue(yesterday);
    }
  }
}

这些是非常简单的功能。 Date()以毫秒为单位,因此我们必须将这24和48小时转换为该单位。然后,使用您需要的格式设置结果的格式:“ 2019年7月28日”等于“ MMMM dd,yyyy”。有关日期格式here的更多信息。

function getYesterday() {
  var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; //24 hours
  var now = new Date();

  var formattedDate = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), "GMT", "MMMM , dd, yyyy");
  return formattedDate;
}
function deduceTwodays() {
  var MILLIS_PER_DAY = 1000 * 60 * 60 * 48; //48 hours
  var now = new Date();

  var formattedDate = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), "GMT", "MMMM , dd, yyyy");
  return formattedDate;
}

注意:单元格中的日期必须以纯文本格式存储,否则比较条件将失败,因为它将读取带有时间的整个日期。