无法从此上下文调用SpreadsheetApp.getUi(),但不能在基于时间的触发器上使用getUi

时间:2019-05-06 15:41:45

标签: google-apps-script google-sheets triggers

我试图每晚运行一个函数,该函数检查日期列表,并且如果发现日期已过并且该行中的所有复选框均被选中,则该函数可以正常工作。但是,每天我都会收到一封电子邮件,内容为“无法从此上下文调用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);
        }  
    }
}

}

1 个答案:

答案 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()。查看错误消息是否像我的一样提到另一个文件。当您的脚本在夜间运行时,将没有上下文,这可以解释当时为什么发生错误。