一个GetDataAsync请求中的OfficeJS多个绑定

时间:2018-01-11 13:58:59

标签: javascript excel office-js

我有一个OfficeJS Manifest文件链接到这个.html文件,以及一个与executefunction绑定的按钮事件。我的问题是从不同的标签中获取多个不同的值,以便我可以向Web服务器发出AJAX请求。

(function () {

    Office.initialize = function (reason) {
        $(document).ready(function () {
            registerBindings();
        });
    }

    function registerBindings() {
        Office.context.document.bindings.add("Sheet1!A1", "range", "binding_a");
        Office.context.document.bindings.add("Sheet2!A1", "range", "binding_b");
        Office.context.document.bindings.add("Sheet3!A1", "range", "binding_c");
        Office.context.document.bindings.add("Sheet4!A1:C3", "range", "results");
        return context.sync();
    }

})();

// function file execution must be global
function executefunction() {
    Office.select("bindings#binding_a", ...).getDataAsync(type,
        function (result) { // callback function
            Office.select("bindings#results").setDataAsync = $.AJAX(result.values)
        })
    event.completed();
}

因此,如何选择多个绑定并使用result.values回调中的getDataAsync“打包”它们?

1 个答案:

答案 0 :(得分:1)

这里的问题是您将两个不同的API集合,即原始Shared API和较新的Excel API。虽然这些API在office.js内共存,但它们的工作方式略有不同。

使用Excel API,您的代码应如下所示:

function registerBindings() {
    return Excel.run(function (context) {
        // Set your bindings
        context.workbook.bindings.add("Sheet1!A1", "Range", "binding_a");
        context.workbook.bindings.add("Sheet2!A1", "Range", "binding_b");
        context.workbook.bindings.add("Sheet3!A1", "Range", "binding_c");
        context.workbook.bindings.add("Sheet4!A1:C3", "Range", "results");

        // Save the bindings to the document
        return context.sync();
    });
}

// function file execution must be global
function executefunction() {
    return Excel.run(function (context) {

        // Request your bindings
        let bindingA = context.workbook.bindings.getItem("binding_a").getRange().load();
        let bindingB = context.workbook.bindings.getItem("binding_b").getRange().load();
        let bindingC = context.workbook.bindings.getItem("binding_c").getRange().load();

        // Execute your binding request
        return context.sync()
            .then(function () {
                console.log(bindingA.values);
                // Make your ajax call
                $.ajax({ /*...*/ })
                    .done(function (result) {

                        // Write the result to the workbook
                        context.workbook.bindings.getItem("results")
                            .getRange().values = result.values;

                        return context.sync();
                    });
            })
    });
}

请注意,对Excel API的调用是在Excel.run(function (context) {...});函数中进行的。这是为了为API建立适当的上下文所必需的。

另请注意,在您阅读要发送到REST方法的绑定之前,您必须先将load()这些范围context导入subprocess.Popen()