TypeError:在Google脚本中使用多个脚本(库)时方法为空

在Google Sheet中使用库时遇到严重问题。

我有两个电子表格:仪表板1和仪表板2。在这两个电子表格中,我都有多个脚本和触发器。

有一个特定的触发器在Dashboard2中的Event OnEDIT上触发。代码如下:

仪表板2

Code.gs

function onEdit(e){
  Dashboard1.updateReferral(e.oldValue, e.value);
}

仪表板1

Code.gs

function updateReferral(evaluatedEmail, newReferral){
  var employee = returnEmployeeRow(evaluatedEmail);
  PAYROLL_SHEET.getRange(REFERRAL_COLUMN + employee[2]).setValue(newReferral);
}

Constants.gs

var SHEET_CATEGORIES = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Categorias");
var RANGE_CATEGORIES = SHEET_CATEGORIES.getRange("A2:G");
var CATEGORIES = RANGE_CATEGORIES.getValues();

我要做的是,当有人在仪表板2中进行编辑时,它会更新仪表板1中的一行。

当我尝试触发事件时,它抛出错误

TypeError: Cannot call method "getRange" of null. (line 2, file "Constants", project "XXXXXX")

我发现这个错误是因为Dashboard2中没有工作表"Categorias"。 如果我在Dashboard2中创建一个工作表"Categorias",它可以正常工作。

我的问题是:

  1. 这是正常行为吗?为什么当我运行代码时,它试图从Dashboard1中的Constants.gs初始化变量,因为它们存在于Dashboard2中?

  2. 这个问题有解决方案吗?还是我做不到?

我尝试在.gs文件中使用不同的名称,但不起作用。 我还尝试删除文件Constants.gs,并将所有变量都放在Code.gs中。


解决方案

来自操作员的问题

我的问题是:

  1. 这是正常行为吗?为什么当我运行代码时,它试图从Dashboard1中的Constants.gs初始化变量,因为它们存在于Dashboard2中?

是的,此行为"正常"。

  1. 这个问题有解决方案吗?还是我做不到?

解决方案有很多种。Google Apps脚本项目的一些经验法则,可以帮助您决定如何继续:

  1. 减少全局作用域中的变量声明,并在全局作用域中声明变量时,将其限制为赋值。
  2. 仅对库使用独立项目,但如果确实需要将绑定项目用作库,请不要在库函数上使用"getActive"方法,而是将"active"对象作为参数添加到需要它们的库函数上。

相关

  • GAS: Problems in using global variables in functions
  • Variable scope between spreadsheet script and script library
  • Calling variables at global scope and comparing it in Google apps script
  • Using Global vars in GAS, is it advisable? are there any downsides?

相关文章