如何在Google Apps脚本中刷新工作表的单元格值

时间:2015-07-27 17:09:24

标签: google-apps-script google-sheets

我正在试验提供Google表格插件的Blockspring,例如,该插件可以运行从网络服务返回数据的功能,例如

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

我想刷新单元格的数据,但在文档中看不到“刷新”调用。

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

}

6 个答案:

答案 0 :(得分:18)

使用flush()方法:

Google Documentation

SpreadsheetApp.flush();

来自文档的引用:

  

应用所有待处理的电子表格更改

如果电子表格没有变化,但您想强制重新计算公式,则需要进行更改,然后使用SpreadsheetApp.flush();

例如,您可以从单元格A1获取值,然后将相同的值设置为单元格A1。因此,没有机会丢失数据,因为您正在获取并设置相同的值。这种变化允许。 SpreadsheetApp.flush();重新计算所有公式。

答案 1 :(得分:8)

代替使用flush,您可以通过将电子表格传递到其期望参数末尾的公式来告诉电子表格该函数所依赖的单元格。可以传递比函数要使用的更多的参数。这样,电子表格将假定如果输入不同,则函数返回的值可能会有所不同,并且正常的更新过程会处理该问题。

如果您希望它在任何单元格发生变化时重新评估,只需传递一个包含所有单元格的范围。

例如:

=MyFunction("this", "that", A1:Z10000)

如果您花时间准确传递该函数在逻辑上所依赖的单元格,则无需重新评估不需要的单元格即可提高效率。

=MyFunction("this", "that", A10, C5, G6:H9 )

如果它实际上并不依赖于任何单元格,但是您希望根据需要手动评估该函数,请创建一个单元格,使其在用户单击时增加其隐藏值(请参见按钮),然后将该单元格地址传递给该函数

=MyFunction("this", "that", A10 )
// make A10 change its value on a button click

答案 2 :(得分:2)

发布有用的代码段,以防您需要强制所有公式重新计算。与此处发布的其他示例相比,它的性能要高得多。

function forceRefreshSheetFormulas(sheetName) {
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = activeSpreadsheet.getSheetByName(sheetName);
  var range = sheet.getDataRange();
  var numCols = range.getNumColumns();
  var numRows = range.getNumRows();
  var rowOffset = range.getRow();
  var colOffset = range.getColumn();

  // Change formulas then change them back to refresh it
  var originalFormulas = range.getFormulas();

  //Loop through each column and each row in the sheet
  //`row` and `col` are relative to the range, not the sheet
  for (row = 0; row < numRows ; row++){
    for(col = 0; col < numCols; col++){
      if (originalFormulas[row][col] != "") {
        range.getCell(row+rowOffset, col+colOffset).setFormula("");
      }
    };
  };
  SpreadsheetApp.flush();
  for (row = 0; row < numRows ; row++){
    for(col = 0; col < numCols; col++){
      if (originalFormulas[row][col] != "") {
        range.getCell(row+rowOffset, col+colOffset).setFormula(originalFormulas[row][col]);
      }
    };
  };
  SpreadsheetApp.flush();
};

有一些技巧在起作用: -将单元格的公式设置为""会清除它,因此我们避免这样做。 -我们需要更改公式,冲洗,然后改回并再次冲洗。

答案 3 :(得分:1)

基于以上@Sandy_Good答案的示例。补充一点,因为我不得不花点时间来解释如何使用它来自动评估任何工作表更改上的单元格公式。这段代码运行速度很慢,但是我希望作为一个通用示例来分享它,希望对您有所帮助,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); 
}

现在使用onEdit触发器调用它

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

这将暂时重新编写单元格1,1中的公式,将“ =“替换为”?“,然后进行flush(),然后将其改回,并在工作表中进行任何编辑后强制求值。

单元格中的自定义公式可能类似于:= SUMSTATUS(“ MySheet”,“ InProgress”)

应为: = BLOCKSPRING(“ get-stock-current-stats”,“ ticker”,“ MSFT”)

答案 4 :(得分:0)

刷新所有表 它的速度很慢,但是可以正常工作!

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

答案 5 :(得分:-2)

选择具有公式的单元格或具有公式的多个单元格 从Google菜单中选择: Add-ons > Blockspring > Refresh Selected Cells

希望有所帮助