Пользовательская функция постоянно выдает ошибку - PullRequest
1 голос
/ 27 апреля 2019

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

function CONDITIONALVALIDATION(sheetName,cellToCheckA1,validationCell,validationItems){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName(sheetName);
  var cellValue = sheet.getRange(cellToCheckA1).getValue();
  var cellToSet = sheet.getRange(validationCell);
  cellToSet.clearDataValidations();
  if(cellValue!=""){
  var unitsRule = SpreadsheetApp.newDataValidation().requireValueInList(validationItems, true);
    cellToSet.setDataValidation(unitsRule)
  }
}

Когда я вызываю тестовую функцию, которая заполняет параметры для функции CONDITIONALVALIDATION и запускаю ее в редакторе, я вижу желаемые результаты.Эта функция выглядит следующим образом:

function testconditional(){
  CONDITIONALVALIDATION("Front End","E12","F12",["x","y"]);
}

Однако, когда я вызываю функцию как пользовательскую функцию в ячейке, я постоянно получаю

«Ошибка разбора формулы».

Я уже исключил синтаксис в качестве возможной причины;вызов функции в моей тестовой функции точно такой же, как когда я вызываю ее в пользовательской функции внутри ячейки.Сохраните, конечно, знак равенства перед вызовом функции, чтобы указать, что это функция, которую нужно запустить.Я также знаю, что функция распознается по листам;не существует "Функция не существует" или "# ИМЯ?"ошибка при вызове функции внутри ячейки.

Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Вопрос (ы):

Литералы Javascript Array [] не являются допустимым синтаксисом формулы электронной таблицы. Попробуйте {} вместо:

=CONDITIONALVALIDATION("Front End","E12","F12",{"x","y"});

Сказав это, как написано в документации, пользовательские функции не могут .setDataValidation(unitsRule)

Электронная таблица

Только чтение (можно использовать большинство методов get * (), но не set * ()).

Решение:

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

1 голос
/ 27 апреля 2019

Пользовательские функции скрипта Служб Google не могут вносить изменения в объекты (электронная таблица, лист, диапазон и т. Д.).Они могут только возвращать значение или массив значений.

Ref.https://developers.google.com/apps-script/guides/sheets/functions

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

Asуже упоминалось, одна альтернатива заключается в использовании пользовательского меню.Обычно триггер при редактировании не упоминается, потому что он не запускается при изменении результата формулы, но в некоторых сценариях может работать, например, когда ожидается, что изменение вносится, когда используется редактирование ячейки.

...