按名称获取工作表

71

我正在尝试让以下公式起作用:

function setDataValid(range, sourceRange) {
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
  range.setDataValidation(rule);
}

function onEdit() {
  var aCell = SpreadsheetApp.getActiveSheet().getActiveCell();
  var aColumn = aCell.getColumn();

  if (aColumn == 2 && SpreadsheetApp.getActiveSheet().getName() == 'Local' ) {
    var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);
    var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(aCell.getValue());
    setDataValid(range, sourceRange)
  }
}

当在调试onEdit()时,setDataValid(range, sourceRange)中的sourceRange显示为null。由于范围在我的工作表“Local”中,我正在尝试将getActiveSpreadsheet()更改为按名称获取电子表格。有谁能帮忙吗?

调试onEdit()时,发现setDataValid(range, sourceRange)中的sourceRange为null。由于范围在我的“Local”工作表中,我尝试通过名称获取电子表格来替换getActiveSpreadsheet()。请问是否有人可以提供帮助?

3个回答

155

通过名称在电子表格上获取工作表:

var sheet = SpreadsheetApp.getActive().getSheetByName('Local')

11

非常简单,只需按名称获取表格,其语法如文档所述。

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Expenses");

1
getActivegetActiveSpreadsheet 是同义词。更倾向使用前者,因为后者太类似于 getActiveSheet,而该方法不返回 Spreadsheet 对象。 - tehhowch
我不再相信这是真的了。getActiveSpreadsheet().getSheetByName(xxx) 目前会返回一个错误。使用 getActive().getSheetByName() 可以正常工作。 - crthompson
getSheetByName的文档在哪里可以找到?它在Sheet类文档页面中的多个位置被使用,但从未明确记录。 - Dan Dascalescu

1
请查看该语句。
var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(aCell.getValue());

这个应该返回 null。关于原因,请查看官方文档

var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('Local!TaxRates')

应该获取范围。

谢谢。但是我需要getRangeByName的值取决于我刚编辑的单元格中的值。 - Michiel van Dijk
使用getRangeByName的参数来包含你的表格名称和具有命名范围名称的单元格值。var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('Local!'+aCell.getValue()) - Suhail Ansari
仍然返回这样的错误 参数不能为空:范围(第2行,文件“代码”) - Michiel van Dijk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接