在Google表格中使用库时遇到严重问题。
我有两个电子表格:Dashboard1和Dashboard2。在两个电子表格中,我都有多个脚本和触发器。
具体来说,有一个触发器可以在Dashboard2中的事件OnEdit上触发。这是代码:
仪表板2
代码
function onEdit(e){
Dashboard1.updateReferral(e.oldValue, e.value);
}
仪表板1
代码
function updateReferral(evaluatedEmail, newReferral){
var employee = returnEmployeeRow(evaluatedEmail);
PAYROLL_SHEET.getRange(REFERRAL_COLUMN + employee[2]).setValue(newReferral);
}
常数
var SHEET_CATEGORIES = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Categorias");
var RANGE_CATEGORIES = SHEET_CATEGORIES.getRange("A2:G");
var CATEGORIES = RANGE_CATEGORIES.getValues();
我想要做的是当有人在Dashboard2中进行编辑时,它更新了Dashboard1中的一行。
当我尝试触发事件时,它将引发错误
TypeError: Cannot call method "getRange" of null. (line 2, file "Constants", project "XXXXXX")
我发现存在此错误是因为Dashboard2中没有工作表“ Categorias”。
如果我在Dashboard2中创建工作表“ Categorias”,则工作正常。
我的问题是:
这是正常现象吗?为什么当我运行代码时,它尝试从Dashboard2中存在的Constants.gs初始化Dashboard2中的变量?
有解决方案吗?或者只是我做不到?
我尝试在.gs文件中使用其他名称,但没有用。
还尝试删除文件Constants.gs,并将所有变量包含在Code.gs中。
最佳答案
从OP的问题
我的问题是:
这是正常现象吗?为什么当我运行代码时,它尝试从Dashboard2中存在的Constants.gs初始化Dashboard2中的变量?
是的,此行为是“正常”的。
有解决方案吗?或者只是我做不到?
有很多解决方案。 Google Apps Script项目的一些“拇指”规则可以帮助您决定如何进行:
减少在全局范围内的变量声明,并在全局范围内声明变量时将其限制为分配文字。
仅对库使用独立项目,但是如果您确实需要使用有限项目作为库,则不要在库函数上使用“ 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?