В любом случае, чтобы получить прецеденты и зависимые ячейки в Excel Javascript API?
В отличие от настольных API-интерфейсов Excel, которые содержат "Прецеденты" и "Зависимые" на объекте Range, краткий ответ - нет для API-интерфейсов Excel Javascript, что приводит меня сюда.
Есть ли способ или сторонний кусок кода, чтобы обойти этот огромный недостаток от Microsoft? Если я не могу перемещаться по дереву формул, я могу добавить немного полезного с точки зрения надстроек для Excel Online.
ОБНОВЛЕНИЕ: чтобы добавить некоторый контекст, в прошлом я писал надстройки для аудита в C#, чтобы оценить сложность формул, выполнить расширенную сверку формул, реконструировать формулы по-другому и т. Д. Я пытаюсь преобразовать небольшой фрагмент из него, как надстройка прототипа javascript, чтобы увидеть, сможет ли Excel онлайн справиться с этим.
3 ответа
Я посмотрел на это в начале года.
Единственный способ на данный момент состоит в том, чтобы проанализировать ссылки из формулы, которая является нетривиальной (но достижимой), учитывая большое разнообразие возможных типов ссылок.
Для начала посмотрите здесь http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html
И даже тогда у вас все еще будут ограничения для функций, возвращающих ссылки, такие как OFFSET, INDIRECT и т. Д., Поскольку в JS API в настоящее время нет методов Evaluate.
И чтобы быть всеобъемлющим, вы также должны обрабатывать такие вещи, как неявное пересечение и т. Д.
Последняя версия JS API действительно содержит методы для работы с именованными формулами, что является хорошим шагом вперед, поэтому парсер также сможет найти ссылки на них.
Почему вы хотите знать прецеденты клетки? Это для реализации функциональности, подобной формуле, чтобы ваше дополнение могло включить такую функцию, как =JEROMESUM(A1,A7)
?
Если это так, JavaScript API недавно добавил эту возможность в предварительный просмотр, которую вы можете попробовать, которая называется "пользовательские функции": https://aka.ms/customfunctions
Теперь это возможно. В примерах ниже я использую ячейки A1:C1. Ячейка A1 содержит значение 1. Ячейка B1 содержит формулу=A1 + 1
а ячейка C1 содержит формулу=B1
. Используемой активной ячейкой является ячейка B2.
В этом примере используется и модифицируется код Microsoft из их документации. В их документации использовались прецеденты. Поэтому я добавил дополнительный пример с использованием иждивенцев.
Примечание . Если вы не используете активную ячейку, которая имеет как прецеденты, так и зависимые элементы (например, B1 в данном случае), код выдаст ошибку:
$("#run").click(() => tryCatch(run));
async function run() {
await Excel.run(async (context) => {
let range = context.workbook.getActiveCell();
let precedents = range.getPrecedents();
let dependents = range.getDependents();
let directPrecedents = range.getDirectPrecedents();
let directDependents = range.getDirectDependents();
range.load("address");
precedents.areas.load("address");
directPrecedents.areas.load("address");
dependents.areas.load("address");
directDependents.areas.load("address");
await context.sync();
for (let i = 0; i < precedents.areas.items.length; i++) {
console.log(` ${precedents.areas.items[i].address}`);
}
for (let i = 0; i < directPrecedents.areas.items.length; i++) {
console.log(` ${directPrecedents.areas.items[i].address}`);
}
for (let i = 0; i < dependents.areas.items.length; i++) {
console.log(` ${dependents.areas.items[i].address}`);
}
for (let i = 0; i < directDependents.areas.items.length; i++) {
console.log(` ${directDependents.areas.items[i].address}`);
}
});
}
/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
try {
await callback();
} catch (error) {
// Note: In a production add-in, you'd want to notify the user through your add-in's UI.
console.error(error);
}
}
разница между прямыми и непрямыми методами заключается в том, что прямой возвращает только прямые зависимости/прецеденты ячеек. Непрямые методы также возвращают косвенные ссылки на ячейки. Например, если ячейка B1 относится к A1, а ячейка C1 относится к B1,getDependents()
для ячейки A1 вернет 2 ячейки для прямых (B1) и косвенных (C1) ссылок. Тогда какgetDirectDependents()
для ячейки A1 вернет только 1 ячейку (B1)
Вы можете прочитать больше здесь