Почему моя пользовательская функция Excel никогда не возвращает значение ТОЛЬКО в Windows?

#javascript #excel-formula #promise #office-js #office-addins

#javascript #excel-формула #обещание #office-js #office-дополнения

Вопрос:

Я создаю надстройку Office Excel, используя платформу веб-надстроек, предоставляемую Microsoft. Эта надстройка также включает пользовательскую функцию. В настоящее время пользовательская функция работает в Excel для Mac, Excel online (не зависит от устройства), но не в Windows?

Надстройка загружается нормально, и очевидных ошибок нет. Но когда функция запускается (в Windows), она просто говорит: #BUSY а затем преобразуется в #VALUE! и остается такой.

Код также работает при использовании Shared Runtime конфигурации, но для этого требуется, чтобы мы сделали весь наш Javascript совместимым с IE, что, безусловно, возможно, но я хотел бы знать, почему обычная конфигурация не работает.

WISE это функция Excel.

 function WISE(symbol, parameter, year, quarter) {
  var param = parameter.replace(/s/g, '').toLowerCase();
  param = param.replace('amp;', 'and');
  symbol = symbol.toUpperCase();
  if (quarter == null) {
    return getAnnualData(symbol, param, year);
  } 
}

function getVal(data, param) {
  var apiResponseDataFormatted = {};
  for (var key in data) {
    apiResponseDataFormatted[key.replace(/ /g, '').toLowerCase()] = data[key];
  }
  var newValue = apiResponseDataFormatted[param];
  if (newValue !== 0 amp;amp; !newValue) {
    newValue = 'Unavailable';
  }
  return newValue;
}

function getAnnualData(symbol, parameter, year) {
  var apiPath = requestMap[parameter];
  var response = "";
  var url = URL_API   "/"   apiPath   "/"   symbol   "?apikey="   api_key;

  var request = new XMLHttpRequest();
  request.open('GET', url, false);  // `false` makes the request synchronous
  request.send(null);

  if (request.status === 200) {// That's HTTP for 'ok'
    response = JSON.parse(request.responseText);
  }else{
    return "Request Error: "   request.status   " "   url;
  }

  var apiResponseData;
  var currentYear = new Date().getFullYear();
  if (year != null amp;amp; year !== currentYear) {
    apiResponseData = response[currentYear - year - 1];
  } else {
    apiResponseData = response[0];
  }
  result = getVal(apiResponseData, parameter)

  return resu<
}
  

Ответ №1:

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

Мы рекомендуем использовать общую среду выполнения как способ обойти это. Это эффективно запустит пользовательскую функцию в том же времени выполнения, что и панель задач, поэтому я подозреваю, что это сработает для вас. Это также упрощает совместное использование состояния между панелями задач и функциями.

Вы можете попробовать это?

https://learn.microsoft.com/en-us/office/dev/add-ins/tutorials/share-data-and-events-between-custom-functions-and-the-task-pane-tutorial

(Я понимаю, что в документах это не очень понятно, поэтому буду следить за этим в автономном режиме, чтобы исправить это).

Комментарии:

1. Привет @Keyur, мы с Джейком работаем вместе в одной команде — мы попытались поместить скрипт функции в тег head нашей панели задач, но пользовательская функция по-прежнему не работала. После дополнительных исследований мы добавили это в манифест: <Runtimes> Url» lifetime=»long» /> </ Runtimes> поскольку это то, что требуется для общего времени выполнения, и это полностью сломало приложение и не позволило ему загружаться при попытке использовать панель задач. У вас есть еще одно предложение о том, что делать?

2. Привет @Keyur, очень ценю ваш ответ. Как мы можем с вами связаться? Мне удобно публиковать свою электронную почту, чтобы вы могли отправить мне сообщение, сохраняя свою электронную почту общедоступной. Пожалуйста, дайте мне знать