我试图每晚运行一个函数,该函数检查日期列表,并且如果发现日期已过并且该行中的所有复选框均被选中,则该函数可以正常工作。但是,每天我都会收到一封电子邮件,内容为“无法从此上下文调用SpreadsheetApp.getUi()。(第172行,文件“代码”))。奇怪的是,我在CheckHireDates函数的任何地方都没有使用getUi,并且它指定的行甚至不在应该运行的函数中。第172行在我的onEdit函数中,该函数也不使用getUi。有人可以帮我理解为什么我会收到此错误吗?
我确实在onOpen函数中使用了getUi,因此当我开始遇到此问题时就将其注释掉了,但仍然无法解决任何问题。
function CheckHireDates() {
var spreadsheet = SpreadsheetApp.getActive();
var PaycomSheet = spreadsheet.getSheetByName('Paycom');
var TechSheet = spreadsheet.getSheetByName("Tech Key");
var SoftwareTracker = spreadsheet.getSheetByName('Software Tracking');
var range = "R2:R";
var Hvals = PaycomSheet.getRange("H2:H").getValues();
var Hlast = Hvals.filter(String).length;
var data = PaycomSheet.getRange(range).getValues();
var today = new Date().toLocaleDateString();
for(var i = 0; i < Hlast;i++)
{
Hvals[i].toLocaleString();
if(Hvals[i] <= today && (PaycomSheet.getRange('R' + (i+2)).getValue() == true))
{
var fullName = PaycomSheet.getRange('D' + (i+2)).getValue();
var techRow = findMatchingRow(fullName, "Tech Key");
var softwareRow = findMatchingRow(fullName, "Software Tracking");
var position = PaycomSheet.getRange('G' + (i+2)).getValue();
TechSheet.getRange('E' + techRow).setValue(1);
SoftwareTracker.getRange('G' + softwareRow).setValue(1);
if (position == "Pre-Employment, Initial")
{
position = "Initial";
}
else if (position == "Pre-Employment, Ace")
{
position = "Route";
}
else if (position == "Pre-Employment, Expert")
{
position = "Route";
}
else
{
Logger.log("Position not known");
}
TechSheet.getRange('G' + techRow).setValue(position);
SoftwareTracker.getRange('D' + softwareRow).setValue(position);
SoftwareTracker.getRange('H' + softwareRow + ':M' + softwareRow).setValue(2);
if (position !== "Initial")
{
SoftwareTracker.getRange('N' + softwareRow).setValue(2);
}
}
}
}
答案 0 :(得分:1)
我遇到了这个问题,发现它涉及到另一个用户设置的项目中的另一个Google脚本。该错误消息混合了我的脚本和其他脚本的详细信息:
myFunctionName 无法从此上下文调用SpreadsheetApp.getUi()。 (第2行,文件“ OtherScript ”)
other 脚本的第二行确实使用了getUi()
var app = SpreadsheetApp.getUi();
看来,当我的脚本运行(由onChange事件触发)时,另一个脚本也将运行(可能也由change事件触发)。另一个脚本设置了一些UI元素,一些简单菜单。通常,这不会造成任何问题。但是,SpreadsheetApp.getUi()仅在存在当前打开的编辑器实例的情况下起作用(请参见https://developers.google.com/apps-script/reference/base/ui)。因此,如果在没有打开编辑器的情况下发生了更改事件,那么它将失败,从而导致错误。
我通过稍微修改其他脚本来解决问题来解决该问题:
try {
app = SpreadsheetApp.getUi();
} catch (error) {}
if (app != null) {
//Use app...
}
也可能有用的另一种方法是与人员交谈以及如何触发他们的脚本,并查看他们是否将其更改为由仅在有人打开电子表格时才发生的onOpen事件触发。使用者介面。
所以,我认为您的问题将来自项目中其他脚本中的SpreadsheetApp.getUi()。查看错误消息是否像我的一样提到另一个文件。当您的脚本在夜间运行时,将没有上下文,这可以解释当时为什么发生错误。