Поделиться через


Обработка и возврат ошибок из пользовательской функции

Если пользовательская функция получает недопустимые входные данные, не может получить доступ к ресурсу или не может вычислить результат, верните наиболее конкретную ошибку Excel. Проверьте параметры на ранней стадии, чтобы быстро завершить ошибку, и используйте try...catch блоки, чтобы превратить низкоуровневые исключения в явные ошибки Excel.

Обнаружение и возвращение ошибки

В следующем примере выполняется проверка U.S. ZIP Code с помощью регулярного выражения перед продолжением. Если формат недопустим, возникает #VALUE! ошибка.

/**
* Gets a city name for the given U.S. ZIP Code.
* @customfunction
* @param {string} zipCode
* @returns The city of the ZIP Code.
*/
function getCity(zipCode: string): string {
  let isValidZip = /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(zipCode);
  if (isValidZip) return cityLookup(zipCode);
  let error = new CustomFunctions.Error(CustomFunctions.ErrorCode.invalidValue, "Please provide a valid U.S. zip code.");
  throw error;
}

Объект CustomFunctions.Error

Объект CustomFunctions.Error возвращает ошибку в ячейку. Укажите ошибку ErrorCode , выбрав значение из следующего списка.

Значение перечисления ErrorCode Значение ячейки Excel Описание
divisionByZero #DIV/0 Функция пытается разделить на ноль.
invalidName #NAME? В имени функции есть опечатка. Обратите внимание, что эта ошибка поддерживается как ошибка ввода пользовательской функции, но не как ошибка вывода пользовательской функции.
invalidNumber #NUM! Существует проблема с числом в формуле.
invalidReference #REF! Функция ссылается на недопустимую ячейку. Обратите внимание, что эта ошибка поддерживается как ошибка ввода пользовательской функции, но не как ошибка вывода пользовательской функции.
invalidValue #VALUE! Значение в формуле имеет неправильный тип.
notAvailable #N/A Функция или служба недоступны.
nullReference #NULL! Диапазоны в формуле не пересекаются.

В следующем примере кода показано, как создать и вернуть ошибку для неверного числа (#NUM!).

let error = new CustomFunctions.Error(CustomFunctions.ErrorCode.invalidNumber);
throw error;

Ошибки #VALUE! и #N/A также поддерживают пользовательские сообщения об ошибках. Пользовательские сообщения об ошибках отображаются в меню индикатора ошибки, доступ к которому осуществляется путем наведении указателя мыши на флаг ошибки в каждой ячейке с ошибкой. В следующем примере показано, как вернуть пользовательское сообщение об ошибке с ошибкой #VALUE! .

// You can only return a custom error message with the #VALUE! and #N/A errors.
let error = new CustomFunctions.Error(CustomFunctions.ErrorCode.invalidValue, "The parameter can only contain lowercase characters.");
throw error;

Обработка ошибок при работе с динамическими массивами

Пользовательские функции могут возвращать динамические массивы, включающие ошибки. Например, пользовательская функция может выводить массив [1],[#NUM!],[3]. В следующем примере кода показано, как передать три параметра в пользовательскую функцию, заменить один параметр ошибкой #NUM! , а затем вернуть двумерный массив с результатами для каждого входного ввода.

/**
* Returns the #NUM! error as part of a 2-dimensional array.
* @customfunction
* @param {number} first First parameter.
* @param {number} second Second parameter.
* @param {number} third Third parameter.
* @returns {number[][]} Three results, as a 2-dimensional array.
*/
function returnInvalidNumberError(first, second, third) {
  // Use the `CustomFunctions.Error` object to retrieve an invalid number error.
  const error = new CustomFunctions.Error(
    CustomFunctions.ErrorCode.invalidNumber, // Corresponds to the #NUM! error in the Excel UI.
  );

  // Enter logic that processes the first, second, and third input parameters.
  // Imagine that the second calculation results in an invalid number error. 
  const firstResult = first;
  const secondResult =  error;
  const thirdResult = third;

  // Return the results of the first and third parameter calculations and a #NUM! error in place of the second result. 
  return [[firstResult], [secondResult], [thirdResult]];
}

Ошибки в качестве входных данных пользовательской функции

Пользовательская функция может оценить, даже если входной диапазон содержит ошибку. Например, пользовательская функция может принимать диапазон A2:A7 в качестве входных данных, даже если A6:A7 содержит ошибку.

Для обработки входных данных, содержащих ошибки, настраиваемая функция должна иметь свойство allowErrorForDataTypeAny метаданных JSON, которое имеет значение true. Дополнительные сведения см. в статье Создание метаданных JSON вручную для пользовательских функций .

Важно!

Свойство allowErrorForDataTypeAny можно использовать только с созданными вручную метаданными JSON. Это свойство не работает с автоматически созданным процессом метаданных JSON.

Использование try...catch блоков

Используйте try...catch блоки для перехвата потенциальных ошибок и возврата пользователям значимых сообщений об ошибках. По умолчанию Excel возвращает необработанных #VALUE! ошибок или исключений.

В следующем примере кода пользовательская функция использует выборку для вызова службы REST. Если вызов завершается сбоем, например когда служба REST возвращает ошибку или сеть недоступна, пользовательская функция возвращается #N/A , чтобы показать, что веб-вызов завершился сбоем.

/**
 * Gets a comment from the hypothetical contoso.com/comments API.
 * @customfunction
 * @param {number} commentID ID of a comment.
 */
function getComment(commentID) {
  let url = "https://www.contoso.com/comments/" + commentID;
  return fetch(url)
    .then(function (data) {
      return data.json();
    })
    .then(function (json) {
      return json.body;
    })
    .catch(function (error) {
      throw new CustomFunctions.Error(CustomFunctions.ErrorCode.notAvailable);
    })
}

Дальнейшие действия

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

Дополнительные ресурсы