根据 sheet 和 macro/script 的位置动态更新 rspreadsheet.getRange() 列

Dynamically updating rspreadsheet.getRange() column depending on the location of sheet with macro/script

我正在尝试 运行 Sheet1 上的一个宏,以通过动态更新列来验证 Sheet2 上的数据。它选择 Sheet1 中的整列(第一行除外),然后在 Sheet2 中的同一列上进行验证。如示例中所示,spreadsheet.getRange('\'Sheet2'!$P:$P') 被硬编码为始终使用 P2:P9。如果我正在验证 P 列,这很好,当我在 N 列中启动脚本时,如何动态更新它?

  var spreadsheet = SpreadsheetApp.getActive();
  var currentCell = spreadsheet.getCurrentCell();
  spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
  currentCell.activateAsCurrentCell();
  spreadsheet.getActiveRange().setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange(spreadsheet.getRange('\'Sheet2'!$P:$P'), false)                                           
  .build());
};

我相信你的目标如下。

  • 您想使用“Sheet2”的列将数据验证规则设置为活动 sheet,该列与 select 在活动 sheet 编辑的列相同。

为此,这个答案怎么样?

修改点:

  • 在此修改中,从 selected 范围中检索 A1Notation,并从中检索列字母。这样,可以使用selected列字母中的值来设置数据有效性规则。

当你的脚本修改后,变成如下。

修改后的脚本:

请复制并粘贴以下脚本。为了使用这个脚本,请select“Sheet1”上的范围和运行这个函数myFunction。这样,使用“Sheet2”中与 selected 列相同的列,并设置数据有效性规则。

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive();
  var currentCell = spreadsheet.getCurrentCell();
  var range = spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();  // Modified
  var column = range.getA1Notation().split(":")[0].replace(/\d+/g, "");  // Added
  currentCell.activateAsCurrentCell();
  spreadsheet.getActiveRange().setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange(spreadsheet.getRange(`'Sheet2'!$${column}:$${column}`), false).build());  // Modified
}
  • 在此修改中,您的脚本使用了从 29 的行。所以当你要修改这个的时候,请修改上面的脚本。

参考: