如何检查HtmlService是否正在运行?

时间:2019-04-02 11:28:07

标签: google-apps-script

我一直在使用Google Apps脚本HtmlService的应用程序上工作,因此可以用HTML创建UI。该应用程序运行与OnEdit函数共享的一些代码,并且根据我在哪里运行代码,我需要传递不同的参数。因此,我需要检测代码是直接从电子表格还是从HtmlService UI初始化的。

我尝试根据活动电子表格设置参数,但是如果这样做,我只能使用特定工作表中的UI-如果我从其他任何工作中使用UI,则会发生。

下面是代码示例(未声明的变量在其他地方声明):

function loanHistory(input){

  for(var i = 6; i >= 4; i--){
    var currentCell = loanHistorySheet.getRange(deviceRow, i)
    var valueToMove = currentCell.getValue();

    loanHistorySheet.getRange(deviceRow, i).offset(0, 1).setValue(valueToMove);
    currentCell.clearContent();
  }

  var currentlyBorrowed;

  if(activeSheet.getName() === 'Borrow/Hand in') {
    currentlyBorrowed = input;
  } else {
    currentlyBorrowed = input.value;
  }

  loanHistorySheet.getRange(deviceRow, 4).setValue(currentlyBorrowed);
}

在此示例中,我希望使用类似“ isHtmlServiceRunning”的东西,而不是“ activeSheet.getName()===”借用/交手”。

有什么方法可以检测HtmlService UI是否打开以防止意外代码运行?否则,我可能只需要完全分离代码即可。

希望我明确提出了挑战-感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:0)

您的执行函数无法明确确定要调用其来源的Apps脚本。一种重要的简单方法,就是将您的功能分为接口和实现。

HtmlService中,只能访问项目中的“公共” Apps脚本功能。任何"private" function都不能直接调用,但是如果有公共方法可以调用它,则仍然可以访问它。

因此,如果您的原始脚本是这样的:

function onEdit(e) {
  if (e) {
    doTheThing(e.value);
  }
}
function doTheThing(inputVal) {
  /** do stuff */
}

,并且您的HtmlService用户界面直接调用doTheThing,即google.script.run.doTheThing(someVar);,您可以按以下方式实现这种分离:

function onEdit(e) {
  if (e) {
    actualDoTheThing_(e.value);
  }
}
function doTheThing(argFromHtmlService) {
  var realArg = < .... >;
  actualDoTheThing_(realArg);
}
function actualDoTheThing_(inputVal) {
  /** do stuff */
}

,您的HtmlService UI无需更改-您仍将执行google.script.run.doTheThing(someVar);。但是,在服务器端,您已将实现与接口分离,因此可以将调用的源传递给实现。

如果realArg的计算也应从HtmlService UI中的调试中隐藏起来,则可以改为发送附加参数并在实现中进行检查:

function onEdit(e) {
  if (e) {
    actualDoTheThing_(e.value);
  }
}
function doTheThing(argFromHtmlService) {
  actualDoTheThing_(argFromHtmlService, true);
}
function actualDoTheThing_(inputVal, cameFromHtmlService) {
  if (cameFromHtmlService === true) {
    inputVal = < .... >;
  }
  /** do stuff */
}