Как проверить, работает ли HtmlService? - PullRequest
0 голосов
/ 02 апреля 2019

Я работал над приложением, в котором я использую HtmlService скрипта Google Apps, чтобы я мог создавать пользовательский интерфейс в HTML.Приложение запускает некоторый код, который используется совместно с функцией OnEdit, и в зависимости от того, откуда я запускаю код, мне нужно передать различные параметры.Поэтому мне нужно определить, инициализирован ли код непосредственно из электронной таблицы или из пользовательского интерфейса HtmlService.

Я попытался установить параметры в зависимости от активной электронной таблицы, но если я это сделаю, я могу использовать толькоПользовательский интерфейс с определенного листа - если я использую его из любого другого, происходит непреднамеренное.

Вот пример кода (необъявленные переменные объявляются в другом месте):

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);
}

Вв этом примере вместо 'activeSheet.getName () ===' Borrow / Hand in '' мне бы хотелось иметь что-то вроде 'isHtmlServiceRunning'.

Есть ли способ, которым я могу определить, если HtmlService UIоткрыт для предотвращения непреднамеренного выполнения кода?В противном случае, возможно, мне придется полностью отделить код.

Надеюсь, я ясно изложил свою задачу - спасибо всем, кто может помочь!

1 Ответ

0 голосов
/ 03 апреля 2019

Нет явной поддержки скриптов приложений для выполняемых вами функций, чтобы определить источник их вызова. Простой способ «запечь это» для себя, когда это важно, состоит в том, чтобы разделить вашу функциональность на интерфейс и реализацию.

Начиная с HtmlService, в вашем проекте доступны только «публичные» функции скриптов приложений. Любая «приватная» функция не напрямую , которая может быть вызвана, но все же доступна, если есть открытый метод, который ее вызывает.

Таким образом, если ваш сценарий происхождения был таким:

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 пользовательский интерфейс не нужно будет менять - вы все равно выполните google.script.run.doTheThing(someVar);. Однако на стороне сервера вы отсоединили реализацию от интерфейса и, таким образом, можете сообщить своей реализации источник вызова.

Если ваше вычисление realArg также должно быть скрыто от отладки в пользовательском интерфейсе HtmlService, вы можете вместо этого отправить дополнительный аргумент и проверить его в реализации:

function onEdit(e) {
  if (e) {
    actualDoTheThing_(e.value);
  }
}
function doTheThing(argFromHtmlService) {
  actualDoTheThing_(argFromHtmlService, true);
}
function actualDoTheThing_(inputVal, cameFromHtmlService) {
  if (cameFromHtmlService === true) {
    inputVal = < .... >;
  }
  /** do stuff */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...