Google Sheets 脚本的正确范围定义 - 替换公式

问题描述 投票:0回答:1

在尝试制作一个脚本来在 Google Sheet 文件中制作工作表的副本时,我面临着我认为这是一个糟糕的范围定义问题。

除了一个“小”细节外,脚本运行良好。当脚本执行时,有两个(或更多)工作表。一张表是“导出数据库”,用于将导出结构化表复制并粘贴到外部数据库中。另一个工作表将是脚本的对象(执行按钮的活动工作表),它将被复制并重命名为 version_n。

问题是“DB Export”从中提取信息的活动工作表更改了其名称,因此应重命名导出中的公式。

除了“DB Export”中的原始标题消失的小细节之外,一切正常。

这里是代码:

function duplicateSheet() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = spreadsheet.getActiveSheet();

  // Get the original sheet name
  var originalSheetName = activeSheet.getName();

  // Create a copy of the active sheet
  var newSheet = activeSheet.copyTo(spreadsheet);

    // Rename the old sheet with a version number
  var sheets = spreadsheet.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].getName() === originalSheetName) {
      var versionNumber = sheets.length - 1; // Version number is the number of existing sheets
      
      // Check if the original sheet name already contains a version number
      if (/_v\d+$/.test(originalSheetName)) {
        sheets[i].setName(originalSheetName.replace(/_v(\d+)$/, '_v' + versionNumber));
      } else {
        sheets[i].setName(originalSheetName + '_v' + versionNumber);
      }
      break;
    }
  }

  // Rename the new sheet to the original sheet name
  newSheet.setName(originalSheetName);

  // Update the link in the "DB Export" sheet to the new sheet
  var dbExportSheet = spreadsheet.getSheetByName('DB Export');
  if (dbExportSheet) {
    var formulas = dbExportSheet.getDataRange().getFormulas();
    for (var i = 0; i < formulas.length; i++) {
      for (var j = 0; j < formulas[i].length; j++) {
        formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
      }
    }
    dbExportSheet.getRange(1, 1, formulas.length, formulas[0].length).setFormulas(formulas);
  }

在代码的最后部分,我们定义了dbExportSheet DataRange()。我想问题就出在这里。 DataRange 正在获取工作表的所有行/列,而我希望它只修改除第 n°1 行之外的所有工作表。

应该很容易种马,但我错过了一些东西。

提前感谢您的反馈。

google-apps-script google-sheets google-sheets-formula range
1个回答
0
投票

在你的展示脚本中,做如下修改怎么样?

来自:

// Update the link in the "DB Export" sheet to the new sheet
var dbExportSheet = spreadsheet.getSheetByName('DB Export');
if (dbExportSheet) {
  var formulas = dbExportSheet.getDataRange().getFormulas();
  for (var i = 0; i < formulas.length; i++) {
    for (var j = 0; j < formulas[i].length; j++) {
      formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
    }
  }
  dbExportSheet.getRange(1, 1, formulas.length, formulas[0].length).setFormulas(formulas);
}

致:

// Update the link in the "DB Export" sheet to the new sheet
var dbExportSheet = spreadsheet.getSheetByName('DB Export');
if (dbExportSheet) {
  var [, ...formulas] = dbExportSheet.getDataRange().getFormulas(); // Modified
  for (var i = 0; i < formulas.length; i++) {
    for (var j = 0; j < formulas[i].length; j++) {
      formulas[i][j] = formulas[i][j].replace(originalSheetName, newSheet.getName());
    }
  }
  dbExportSheet.getRange(2, 1, formulas.length, formulas[0].length).setFormulas(formulas); // Modified
}
  • 通过此修改,工作表
    DB Export
    通过跳过第一行进行更新。
© www.soinside.com 2019 - 2024. All rights reserved.