Ms office 附加选定单元格的公式

Ms office 附加选定单元格的公式,ms-office,office-js,Ms Office,Office Js,我想实现以下场景:用户选择一个包含公式的单元格,单击我的外接程序的test按钮,然后我的test函数读取所选单元格的公式,将+RAND()附加到其中,然后将其写回工作簿 下面的代码可以很好地读取所选单元格的公式,但不能很好地回写。我不确定(第二个)return ctx.sync()是否正确使用 此外,我不知道是否应该在整个场景中使用getSelectedDataAsync和setSelectedDataAsync(而不是getSelectedRange) 有人能帮忙吗 (function() {

我想实现以下场景:用户选择一个包含公式的单元格,单击我的外接程序的
test
按钮,然后我的
test
函数读取所选单元格的公式,将
+RAND()
附加到其中,然后将其写回工作簿

下面的代码可以很好地读取所选单元格的公式,但不能很好地回写。我不确定(第二个)
return ctx.sync()
是否正确使用

此外,我不知道是否应该在整个场景中使用
getSelectedDataAsync
setSelectedDataAsync
(而不是
getSelectedRange

有人能帮忙吗

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();
            $('#test').click(test);
        });
    }
    ;

    function test() {
        Excel.run(function(ctx) {
            var selectedRange = ctx.workbook.getSelectedRange();
            selectedRange.load(["formulas"]);
            return ctx.sync().then(function() {
                console.log(selectedRange.formulas[0][0]);
                var x = selectedRange.formulas[0][0] + "+RAND()";
                selectedRange.formulas[0][0] = x;
                return ctx.sync();
            })
        }).then(function() {
            console.log("done");
        }).catch(function(error) {
            console.log("Error: " + error);
        });
    }
})();

错误在于,您正试图分配给公式上下文对象中的单个元素。而是使用:

selectedRange.formulas = x;


非常感谢。在哪些情况下,我们应该使用
getSelectedDataAsync
setSelectedDataAsync
而不是
getSelectedRange
?使用getSelectedRange有几个原因。出于您的目的,相关原因是setSelectedDataAsync和getSelectedDataAsync不支持仅限公式的值。使用getSelectedRange的另一个常见原因是在一个异步调用中启用多个读/写操作,而getSelectedDataAsync和setSelectedDataAsync每次调用只能执行一个。避免getSelectedRange的唯一原因是,如果您需要外接程序在不支持该API的地方工作,如Excel 2013。我刚刚尝试了您的建议,它起了作用。。。此外,我还试图删除第二个
return ctx.sync(),它仍然有效。那么,它真的有必要吗?此外,异步编程对我来说不是很简单;我习惯了VBA编程。如果你做了这个场景(即,阅读公式->修改它->写回),你会用类似的结构编写代码(即,加载->
返回ctx.sync()。然后(函数(){
->写回)@SoftTimur,请回答上面的两个问题:
.formulas=x
.formulas=[[x]]
这两项工作都是在前一种情况下,我们将x公式扩展到范围内的所有单元格。在单个单元格的情况下,任何一个单元格都具有相同的效果。至于为什么需要最后一个“return ctx.sync()”——严格地说,您不需要,因为Excel.run将执行最后一个“sync”无论如何,对于你来说,如果有任何挂起的请求。但是,明确地说明这一点仍然是一个好主意,以确保你知道异步,并且不破坏承诺链。
selectedRange.formulas = [[x]];