Ошибка разрешения формулы внутри аддона - getActiveUser

Созданная мной пользовательская формула не работает из-за проблемы с правами доступа, но после выполнения рекомендаций я все еще не могу понять, в чем проблема.

Я написал пользовательскую формулу «СУММЕСЛИМЕТ», которую опубликовал для других членов группы в том же домене в качестве аддона. По какой-то причине, когда мы пытаемся использовать его (включая меня) в электронной таблице, которая не содержит фактического скрипта (но включена через надстройку), возникает следующая ошибка:

Ошибка У вас нет разрешения на вызов getActiveUser (строка 37).

Следуйте этим рекомендациям по разрешению доступа к пользовательским формулам в таблицах Google: https://developers.google.com/apps-script/guides/sheets/functions#advanced

и конкретно в отношении листов:

Только чтение (можно использовать большинство методов get*(), но не set*()). Не удается открыть другие электронные таблицы (SpreadsheetApp.openById() или SpreadsheetApp.openByUrl()).

Я пытался убедиться, что использую только функции Get, но все равно выдает ошибку. Код:

/**
 * For each cell in {searchCol} that contains the cell content, it adds
 * the correspond value from the same row in {sumCol}
 * {criterion} is optional if want to add a condition the the {sumCol} value also need to fullfill.
 * @param {searchCol} input The column to check and iterate over.
 * @param {sumCol} input The correspond column from which we add to sum.
 * @param {criterion} input An optional field - adding a constraint on {sumCol} values.
 * @return The sum of all cells that met the requirements.
 * @customfunction
 */
function SUMIFALL(searchCol, sumCol, criterion){

  var checkCriteria = criterion != null ? encapsulateCriterion(criterion) : function(val) { return true; };
  var arrayOfSum = searchCol.map(function(cell){
    var sum = 0;
    for(var i=0; i<searchCol.length; i++){
      var traffic = Number(sumCol[i]);
      var phrase = searchCol[i].toString();
      var found = phrase.search(new RegExp("\\b("+cell+")\\b","gi")) != -1;
      sum += checkCriteria(traffic) && found ? traffic : 0;
    }
    return sum;
  });
  return arrayOfSum;
}

/**
 * For each cell in {searchCol} that contains the word {cell} content
 * adds the correspond value from the same row in {sumCol}
 * {criterion} is optional if want to add a condition the the {sumCol} value also need to fullfill.
 * @param {cell} A cell that contains the word to be searched.
 * @param {searchCol} input The column to check and iterate over.
 * @param {sumCol} input The correspond column from which we add to sum.
 * @param {criterion} input An optional field - adding a constraint on {sumCol} values.
 * @return The sum of all cells that met the requirements.
 * @customfunction
 */
function SUMIFREGEX(cell, searchCol, sumCol, criterion){
  var checkCriteria = criterion != null ? encapsulateCriterion(criterion) : function(val) { return true; };
  var sum = 0;
  for(var i=0; i<searchCol.length; i++){
    var traffic = Number(sumCol[i]);
    var phrase = searchCol[i].toString();
    var found = phrase.search(new RegExp("\\b("+cell+")\\b","gi")) != -1;
    sum += checkCriteria(traffic) && found ? traffic : 0;
  }
  return sum;
}


function encapsulateCriterion(criterion){
  var criteriaSplit = criterion.search(/[0-9]/gi);
  var criteria = criterion.substring(0,criteriaSplit);
  var number = Number(criterion.substring(criteriaSplit));

  return function(val){

    return criteria == '=' ? val == number :
    criteria == '<' ? val < number :
    criteria == '>' ? val > number :
    criteria == '<=' ? val <= number :
    criteria == '>=' ? val >= number :
    criteria == '<>' ? val != number : true;
  }
}

Они также упоминают на своей странице:

Если ваша пользовательская функция выдает сообщение об ошибке У вас нет разрешения на вызов службы X, служба требует авторизации пользователя и, следовательно, не может использоваться в пользовательской функции.

Кто-нибудь знает, в чем может быть проблема? Единственная манипуляция с содержимым листа связана с предоставленным диапазоном, что очень похоже на пример, который они предоставили на своей странице.

заранее спасибо


comment
Ваш аддон или связанный скрипт вызывает getActiveUser()?   -  person TheMaster    schedule 25.08.2019
comment
Привет, нет .. предоставляется весь код .. Нет getActiveUser (), даже нет службы SpreadsheetApp ...   -  person sale108    schedule 25.08.2019
comment
Нет, скрипт таблицы полностью пустой   -  person sale108    schedule 25.08.2019
comment
Уверены ли вы? Есть ли что-нибудь еще, связанное с электронной таблицей? Что такое 37 строка? Если вы удалите комментарии из своего аддона, изменится ли строка 37 на какую-то другую строку?   -  person TheMaster    schedule 25.08.2019
comment
Я попробую удалить комментарии, строка 37: i.imgur.com/vvkSgi5.png   -  person sale108    schedule 25.08.2019
comment
Давайте продолжим обсуждение в чате.   -  person sale108    schedule 25.08.2019
comment
Возможный дубликат Какова область действия переменных в JavaScript?   -  person TheMaster    schedule 25.08.2019


Ответы (1)


Судя по всему (как я выяснил с помощью @TheMaster), глобальные переменные внутри файлов проекта влияют на разрешение формул, даже если конкретная формула не содержит запрещенных операций. В другом файле сценария в том же аддоне в строке 37 я вызываю метод «getActiveUser()».

Удаление решило проблему.

person sale108    schedule 25.08.2019
comment
Не весь проект. Но все глобальные переменные. См. предупреждение здесь. - person TheMaster; 25.08.2019