2016-05-26 8 views
1

Ich möchte folgendes Szenario realisieren: ein Benutzer wählt eine Zelle mit einer Formel, klickt auf die test Schaltfläche meines Add-Ins, dann meine test Funktion liest die Formel der ausgewählten Zelle, Hängen Sie +RAND() daran an und schreiben Sie es zurück in die Arbeitsmappe.Append die Formel der ausgewählten Zelle

Der folgende Code liest die Formel der ausgewählten Zelle gut, aber es schreibt nicht gut zurück. Ich bin mir nicht sicher, ob (der zweite) return ctx.sync() korrekt verwendet wird.

Außerdem weiß ich nicht, ob ich getSelectedDataAsync und setSelectedDataAsync (anstatt getSelectedRange) im gesamten Szenario verwenden sollte.

Konnte jemand helfen?

(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); 
     }); 
    } 
})(); 

Antwort

2

Der Fehler ist, dass Sie versuchen, ein einzelnes Element im Formelkontextobjekt zuzuweisen. Stattdessen verwenden:

selectedRange.formulas = x; 

oder

selectedRange.formulas = [[x]]; 
+0

Danke ... und in welchen Fällen sollten wir verwenden 'getSelectedDataAsync' und' setSelectedDataAsync' statt 'getSelectedRange'? – SoftTimur

+1

Es gibt mehrere Gründe, getSelectedRange zu verwenden. Für Ihre Zwecke ist der relevante Grund, dass setSelectedDataAsync und getSelectedDataAsync keine Formelwerte unterstützen. Ein weiterer häufiger Grund für die Verwendung von getSelectedRange besteht darin, mehrere Lese-/Schreibvorgänge in einem einzigen asynchronen Aufruf zu ermöglichen, während getSelectedDataAsync und setSelectedDataAsync nur einen pro Aufruf ausführen können. Der einzige Grund, getSelectedRange zu vermeiden, ist, wenn Sie Ihr Add-In benötigen, um an Orten zu arbeiten, wo diese API nicht unterstützt wird, wie Excel 2013. –

+0

Ich habe gerade Ihren Vorschlag versucht, es hat funktioniert ... Zusätzlich habe ich versucht, die zweite zu entfernen 'return ctx.sync();', es hat noch funktioniert. Also, ist es wirklich notwendig? – SoftTimur