Мы разрабатываем API Excel JavaScript уже несколько месяцев. Мы сталкиваемся с проблемами, связанными с контекстом, которые были решены по неизвестным причинам. Мы не смогли воспроизвести эти проблемы и задались вопросом, как они решены. В последнее время подобные проблемы начали появляться снова. Ошибка, которую мы постоянно получаем:range.address вызывает ошибки, связанные с построением
Недвижимость «адрес» недоступен. Перед чтением значения свойства свойства вызовите метод загрузки для объекта-объекта и вызовите «context.sync()» в контексте связанного запроса.
Мы думали, что у нас есть несколько функций, определенных для модульного кода в проекте, может быть контекст где-то среди этих функций, которые остались незамеченными. Таким образом, мы придумали одно контекстное решение, реализованное с помощью шаблона модуля JavaScript.
var ContextManager = (function() {
var xlContext;//single context for entire project/application.
function loadContext() {
xlContext = new Excel.RequestContext();
}
function sync(object) {
return (object === undefined) ? xlContext.sync() : xlContext.sync(object);
}
function getWorksheetByName(name) {
return xlContext.workbook.worksheets.getItem(name.toString());
}
//public
return {
loadContext: loadContext,
sync: sync,
getWorksheetByName: getWorksheetByName
};
})();
ПРИМЕЧАНИЕ: код выше укорочен. Существуют и другие методы для обеспечения использования единого контекста во всех приложениях. При реализации единого контекста, на этот раз, мы смогли повторить проблему.
Office.initialize = function (reason) {
$(document).ready(function() {
ContextManager.loadContext();
function loadRangeAddress(rng, index) {
rng.load("address");
ContextManager.sync().then(function() {
console.log("Address: " + rng.address);
}).catch(function (e) {
console.log("Failed address for index: " + index);
});
}
for (var i = 1; i <= 1000; i++) {
var sheet = ContextManager.getWorksheetByName("Sheet1");
loadRangeAddress(sheet.getRange("A" + i), i);//I expect to see a1 to a1000 addresses in console. Order doesn't matter.
}
});
}
В вышеуказанном случае только «A1» печатается как адрес диапазона на консоль. Я не вижу ни одного из других адресов (от A2 до A1000). Выполняется только блок catch. Может ли кто-нибудь объяснить, почему это происходит? Хотя я написал для цикла выше, это не мой прецедент. В реальном использовании такие ситуации возникают, когда одному объекту диапазона в функции a требуется загрузить адрес диапазона. В то время как другая функция b также хочет загрузить адрес диапазона. Обе функции a и функция b работают асинхронно на отдельных задачах, таких как создание объекта таблицы (адрес таблицы) и другие данные пасты на листе (есть инструкция отладки, чтобы увидеть, где были вставлены данные).
Это то, что наша команда не смогла найти или найти решение.