Повторное использование объекта диапазона в Excel.run для приложений для офиса

Я новичок в ПРИЛОЖЕНИЯХ для ОФИСА

Я пробую простой код, в котором я проверяю данные Excel. Поэтому вместо того, чтобы снова и снова вкладывать вещи в ctx.sync (), я пишу такой код: -

        // **json** object used beneath is somewhat like:
        {"Field":[
            {"FieldName":"Field1", "FieldDesc":"Field 1 desc", "MappedTo":"B2", "IsMandatory":"true", "LOV":"1,2,3"}]}

       // **LOV** in above json data means:- the field data can only be among the values given.
       
        //********** MY PIECE OF CODE**************
       
        var fieldData = "";
        $.each(json, function (index, field) {
            range = ctx.workbook.worksheets.getActiveWorksheet().getRange(field.MappedTo + ":" + field.MappedTo);
            range.load('text');
            ctx.sync();
            fieldData = range.text;

            if(field.IsMandatory == true && (fieldData == "" || fieldData == null))
            {
                headerValidation = headerValidation + "Data is required for Field : " + field.FieldDesc + "\n";
            }
            else if(field.LOV != "" )
            {
                if($.inArray(fieldData, field.LOV.split(',')) == -1)
                {
                    headerValidation = headerValidation + "Data not among LOV for Field : " + field.FieldDesc + "\n";
                }
            }

            range = null;
        });

Как видно, мне нужно снова и снова читать объект диапазона. Поэтому я использую объект диапазона каждый раз с другим адресом и вызываю сначала load (), а затем ctx.sync ().

Если я отлаживаю медленно, все работает нормально, но при запуске приложения я иногда получаю частую ошибку: -

Свойство "текст" недоступно. Перед чтением значения свойства вызовите метод загрузки для содержащего объекта и вызовите context.sync () для связанного контекста запроса.

Пожалуйста, посоветуй мне, как я могу с этим справиться? Кроме того, мой подход правильный?


person Gurinder Raj    schedule 13.04.2016    source источник


Ответы (1)


Что касается того, что не так, ошибка находится рядом с вашим оператором ctx.sync (). Вам нужно, чтобы это было

ctx.sync()
    .then(function() {
        fieldData = range.text;
        ...
    });

И я не забуду и .catch (function (error) {...}) в конце.

Что касается повторного использования переменной или нет, это действительно не имеет значения. Выполняя «range = ctx.workbook ....», вы фактически создаете глобальную переменную диапазона, что считается плохой практикой. Лучше сделать "var range = ctx.workbook ....". И вам не нужно беспокоиться о том, чтобы установить для него значение null в конце.

Следует отметить, что, поскольку вы делаете это в цикле for-each, обратите внимание, что количество одновременных .sync (), которые могут происходить, ограничено (где-то около 50-60, я полагаю). Поэтому вам может потребоваться скорректировать алгоритм, если вы собираетесь иметь большое количество полей.

Наконец, вы можете сделать этот код намного более эффективным, одновременно создав все объекты диапазона, загрузив их все сразу, а затем выполнив один ".sync".

var ranges = [];
$.each(json, function (index, field) {
    var range = ctx.workbook.worksheets.getActiveWorksheet().getRange(field.MappedTo + ":" + field.MappedTo);
    range.load('text');
    ranges.push(range);
});
ctx.sync()
    .then(function() {
        // iterate through the read ranges and do something
    })

Надеюсь это поможет,

~ Михаил Златковский, разработчик группы расширения Office, MSFT

person Michael Zlatkovsky - Microsoft    schedule 13.04.2016
comment
Эй, это было действительно очень полезно. Спасибо .. Что делать, если мне просто нужно написать что-то только в ячейку. Скажем, в ячейке B2 я хочу написать XYZ. В этом случае я создам диапазон ячеек B2, установлю его свойство Values ​​и вызову ctx.sync (). Вот и все . Здесь мне нечего делать в части then (). Верно? - person Gurinder Raj; 14.04.2016
comment
Правильно, тогда это только в том случае, если вам нужно что-то связать постфактум. Но у вас все равно должен быть .catch, либо там, либо где-то дальше по течению, если вы возвращаете обещание. - person Michael Zlatkovsky - Microsoft; 14.04.2016