it-swarm.com.de

So aktualisieren Sie den Zellenwert eines Arbeitsblatts in Google Apps Script

Ich experimentiere mit Blockspring , das ein Google Sheets-Add-On bereitstellt, das beispielsweise eine Funktion ausführen kann, die Daten von einem Webservice zurückgibt, z.

=BLOCKSPRING("get-stock-current-stats", "ticker", "MSFT")

Ich möchte die Daten einer Zelle aktualisieren, sehe jedoch keinen "Aktualisierungsaufruf" in den Dokumenten.

function onOpen() {
  createTimeDrivenTriggers()
}

function createTimeDrivenTriggers() {
  // Trigger every minute
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .everyMinutes(1)
      .create();

}

function myFunction() {
  Logger.log('I ran'); // can see this in the logs
  SpreadsheetApp.getActiveSheet().getRange('B4').getValue() //presumably returns a value to the script

}
8
codecowboy

Verwenden Sie die flush()-Methode:

Google-Dokumentation

SpreadsheetApp.flush();

Zitat aus der Dokumentation:

Wendet alle ausstehenden Tabellenkalkulationsänderungen an

Wenn keine Änderungen an der Tabelle vorgenommen wurden, Sie jedoch die Neuberechnung der Formeln erzwingen möchten, müssen Sie eine Änderung vornehmen und dann SpreadsheetApp.flush(); verwenden.

Beispielsweise können Sie den Wert aus Zelle A1 abrufen und dann den gleichen Wert in Zelle A1 setzen. Es besteht also keine Möglichkeit, Daten zu verlieren, da Sie denselben Wert erhalten und einstellen. Die Änderung erlaubt. SpreadsheetApp.flush();, um alle Formeln neu zu berechnen.

15
Sandy Good

Beispiel basierend auf der obigen @Sandy_Good-Antwort. Hinzu kam, dass ich mich ein wenig bemühen musste, zu interpretieren, wie dies verwendet wird, um eine Zellenformel bei jedem Blattwechsel automatisch auszuwerten. Dieser Code wird langsam ausgeführt, aber ich teile es als allgemeines Beispiel in der Hoffnung, dass es hilft, YMMV.

/* Force evaluation of custom formula on sheet change.
* Temporarily changes formula text.
* @param sheetName: String Needs to be present in the formula
* @param row: Int
* @param col: Int 
*/

function forceEval(sheetName, row, col){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var orig = sheet.getRange(row,col).getFormula(); 
  var temp = orig.replace("=", "?");
  sheet.getRange(row,col).setFormula(temp); 
  SpreadsheetApp.flush();
  sheet.getRange(row,col).setFormula(orig); 
}

Rufen Sie es jetzt mit dem onEdit-Trigger auf

function onEdit(e){
    forceEval("MySheet", 1, 1)
}

Dadurch wird die Formel in Zelle 1.1 vorübergehend neu geschrieben, wobei "=" durch "?" Ersetzt wird. Anschließend wird Flush () zurückgesetzt, und die Auswertung wird nach jeder Bearbeitung im Arbeitsblatt erzwungen.

Die benutzerdefinierte Formel in einer Zelle könnte in etwa so aussehen: = SUMSTATUS ("MySheet", "InProgress")

Sollte funktionieren für: = BLOCKSPRING ("get-stock-current-stats", "ticker", "MSFT")

1
mauricio777

Aktualisieren Sie alle Tabelle Es ist langsam, aber funktioniert!

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = 38;
var lastRow = 17;
var searchRange = sheet.getRange(2,2, lastRow-1, lastColumn-1);

function forceRefresh() {
  //Loop through each column and each row in the sheet.
  for(i = 1; i < lastColumn; i++){
    for (j = 1; j < lastRow ; j++){
      var cell = searchRange.getCell(j,i);
      var formula = cell.getFormula();
      var tempFormula = formula.replace("=", "?");
      cell.setFormula(tempFormula);
      SpreadsheetApp.flush();
      cell.setFormula(formula);
    };
  };
};

forceRefresh(); //call
0
Jefferson Luis