web-dev-qa-db-fra.com

Comment actualiser la valeur de cellule d'une feuille dans le script Google Apps

J'expérimente avec Blockspring qui fournit un complément Google Sheets qui peut, par exemple, exécuter une fonction qui renvoie des données d'un service Web, par exemple.

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

Je souhaite actualiser les données d'une cellule, mais je ne vois pas d'appel 'actualiser' dans les documents.

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

Utilisez la méthode flush():

Documentation Google

SpreadsheetApp.flush();

Citation de la documentation:

Applique toutes les modifications en attente de la feuille de calcul

S'il n'y a eu aucun changement dans la feuille de calcul, mais que vous souhaitez forcer le recalcul des formules, vous devez effectuer une modification, puis utiliser SpreadsheetApp.flush();

Par exemple, vous pouvez obtenir la valeur de la cellule A1, puis définir la même valeur sur la cellule A1. Il n’ya donc aucune chance de perdre des données, car vous obtenez et définissez la même valeur. Le changement permet. SpreadsheetApp.flush(); pour recalculer toutes les formules.

15
Sandy Good

Exemple basé sur la réponse @ Sandy_Good ci-dessus. J'ajoute depuis que j'ai du mal à interpréter comment l'utiliser pour évaluer automatiquement une formule de cellule à chaque changement de feuille. Ce code est lent, mais je le partage en tant qu'exemple général dans l'espoir que cela aide, 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); 
}

Maintenant appelez-le en utilisant le déclencheur onEdit

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

Cela réécrira temporairement la formule dans la cellule 1,1 en remplaçant "=" par "?", Puis rincera (), puis la rétablira, forçant l'évaluation après toute modification dans la feuille.

La formule personnalisée dans la cellule pourrait ressembler à ceci: = SUMSTATUS ("MySheet", "InProgress")

Devrait fonctionner pour: = BLOCKSPRING ("get-stock-current-stats", "ticker", "MSFT")

1
mauricio777

Actualiser toutes les tables C'est lent, mais ça marche!

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