Вложенный Excel.Run () выдает исключение

У меня есть приложение в магазине, которое работает в 2016 году, в Интернете и на Mac. Однако сегодня Excel Online перестал работать, в то время как 2016 и Mac в порядке. Трудно отследить, поскольку вызовы Excel.Run () просто вызывают «Общее исключение», но, похоже, это происходит, когда я вызываю вложенный Excel.Run (). Так нравится

Excel.run(function (ctx) {
  var worksheets = ctx.workbook.worksheets.load("name");
  return ctx.sync()
     .then(function () {
     ...
     anotherfunction()

а в другой функции () он снова вызывает Excel.run (), но затем выдает исключение.

** добавлено **, если я вызываю другую функцию () вне первого Excel.run (), тогда она работает.

Опять же, весь код работал несколько дней назад и все еще работает на 2016 и Mac, но не в Excel Online. Есть шанс, что Excel Online был обновлен, потому что это кажется странным и трудным для отладки. Я использую Office 365 на сайте office.com.

Извините, потратил на это весь день, и у меня закончились идеи.

Джон

* ниже добавлен полный фрагмент *

(function () {

    // The initialize function must be run each time a new page is loaded.
    Office.initialize = function (reason) {

        $(document).ready(function () {
        })
    }

})();

function allSheetsClick() {
    Excel.run(function (ctx) {
        var worksheets = ctx.workbook.worksheets.load("name");
        return ctx.sync()
            .then(function () {
                for (var i = 0; i < worksheets.items.length; i++) {
                    getSheetRange(worksheets.items[i].name);
                }
            });
    }).catch(function (error) {
        console.log("ERROR-" + error)
    });
}

function oneSheetClick() {
    getSheetRange("Sheet1");
}

function getSheetRange(sheetname) {

    var myRange = "$A$1:$Z$100";

    var bindingid = "MyBinding" + sheetname;
    var sheetrange = sheetname + "!" + myRange;
    // add binding
    Office.context.document.bindings.addFromNamedItemAsync(sheetrange, "matrix", { id: bindingid }, function (asyncResult) {
        if (asyncResult.status === Office.AsyncResultStatus.Succeeded) {
            console.log("Binding added.");
        } else {
            console.log("ERROR addBinding() - " + error);
        }
    });

    Excel.run(function (ctx) {
        var cells = ctx.workbook.worksheets.getItem(sheetname).getRange(myRange).load(["values", "formulasR1C1"]);
        return ctx.sync()
            .then(function () {
                console.log("Got range. # rows - " + cells.values.length);
            });
    }).catch(function (error) {
        console.log("ERROR getRange() - " + error)
    });
}

Проблема возникает, если я добавляю привязку, которая вызывает исключение в более поздней версии Excel.Run (). Таким образом, в Excel Online он попадает в строку «console.log (« ERROR getRange () - «+ error)». Если я закомментирую добавление привязки, все будет работать.

Есть ли лучший способ структурировать это, чтобы мне не приходилось дважды вызывать Excel.Run ()? Но обратите внимание, что второй находится в функции, которая иногда вызывается напрямую.

Опять же, это работает в Excel 2016, но недавно (например, несколько дней назад) в Excel Online начали давать сбои. Позвольте мне, если вам еще что-нибудь понадобится, у меня есть образец сайта, если вам нужно его протестировать.


person JL8707    schedule 31.03.2017    source источник


Ответы (2)


Я могу передать это команде Excel Online, но было бы полезно иметь полный фрагмент.

При этом выполнение вложенных Excel.run-s по своей сути очень опасно и может привести к множеству проблем с синхронизацией. Это также сводит на нет преимущества, которые вы получите от настоящей пакетной обработки. Чего именно вы пытаетесь достичь, чего не может быть в одном Excel.run?

person Michael Zlatkovsky - Microsoft    schedule 31.03.2017
comment
Поместите полный фрагмент в исходное сообщение. allSheetsClick () и oneSheetClick () - это просто события onClick для кнопки html, но allSheetsClick вызывает Excel.run () дважды, а oneSheetClick - только один раз. allSheetsClick () всегда терпит неудачу. oneSheetClicks () кажется, работает в первый раз, но потом не работает в остальное время. Думал, что это может быть из-за того, что привязка уже существует, но, похоже, все в порядке, и в моей более крупной программе я справляюсь с этим правильно. Так что это может не иметь ничего общего с вложенным Excel.run (), но имеет какое-то отношение к привязке. Если можете, дайте мне знать, потому что мое приложение полностью сломано. Спасибо - person JL8707; 31.03.2017
comment
Ваш вызов getSheetRange(worksheets.items[i].name) запускается асинхронно, что вызывает одновременное выполнение нескольких вызовов Excel.run. Другими словами, если у вас есть 3 элемента в массиве, if будет запускать getSheetRange 3 раза за раз. Вам нужно дождаться возврата первого вызова getSheetRange, прежде чем вызывать второй, третий и т. Д. Раз. - person Marc LaFleur; 01.04.2017
comment
Если я удалю цикл, он вызовет getSheetRange () только тогда, когда он все еще получит ошибку. Точно так же, если я вызываю oneSheetClick (), я получаю сообщение об ошибке. - person JL8707; 01.04.2017
comment
Извините. Кажется, что привязка add и getRange также противоречили друг другу. Хорошо, не знал, что асинхронные вызовы могут конфликтовать друг с другом. Так как же заставить вызовы функций ждать? т.е. вверху на уровне петли - person JL8707; 01.04.2017
comment
Если подумать об этом больше, просто потому, что Excel.run является асинхронным и у вас в очереди более двух заданий, не означает, что он должен вызывать исключение. Я думал, что идея Excel.run состояла в том, чтобы объединить их для последующего запуска. т.е. oneSheetClick () при добавлении привязки и вызове Excel.run (). Меня не волнует порядок их запуска, но он не должен вызывать исключение. В противном случае Excel.run () не является потокобезопасным. У меня также есть код, в котором один поток читает ячейки, а другой записывает ячейки, и если это происходит примерно в то же время, я получаю исключение. Это что-то, что изменилось недавно, так как раньше не замечал этой проблемы. - person JL8707; 02.04.2017
comment
Привет @ JL8707, извиняюсь за задержку. Похоже, что на самом деле есть ошибка, которая сейчас изучается, в Excel Online возникают проблемы с несколькими асинхронными вызовами. Итак: у вас должна быть возможность (в пределах разумного, например, в пределах ~ 50 запросов) иметь несколько запросов, которые могут выполняться одновременно. Мы обновим эту ветку, как только проблема будет решена. - person Michael Zlatkovsky - Microsoft; 08.04.2017
comment
Чтобы узнать, как использовать несколько программ Excel.run одновременно (и текущую онлайн-проблему в стороне, поскольку она должна быть решена в ближайшее время и должна возобновить то же поведение, что и рабочий стол), вероятно, лучше всего задать вопрос в отдельном потоке. - person Michael Zlatkovsky - Microsoft; 08.04.2017
comment
Большой. Спасибо за обновления. Сообщите мне, когда это будет исправлено и развернуто, и я смогу это протестировать. - person JL8707; 10.04.2017

Я не уверен, связано ли это с другой ошибкой, которую мы нашли и исправим на следующей неделе (цель). Это привело к сбою привязки API-интерфейсов при одновременном запуске. Он начал появляться 30 марта и распространяется только на Excel онлайн. Я могу обновить эту ветку после того, как исправление будет развернуто в производственной среде.

person Sudhi Ramamurthy    schedule 08.04.2017