如何强制新的Google电子表格刷新并重新计算?

idd*_*ddo 24 google-sheets

为此目的编写了一些代码,但是新的附加组件不再适用.

在此先感谢,Iddo

use*_*211 35

文件 - >电子表格设置 - >(选项卡)计算 - >重新计算(3个选项)
- 开启更改
- 开启更改和每分钟
- 更改时间和每小时
这会影响NOW,TODAY,RAND和RANDBETWEEN的更新频率.

但.. ..它只更新,如果函数参数(它们的范围,单元格)受到影响.
  

从我的例子中
我使用谷歌电子表格来找出一个人的年龄.我的生日日期格式为(dd.mm.yyyy) - >这是瑞士的使用格式.

=ARRAYFORMULA(IF(ISTEXT(K4:K), IF(TODAY() - DATE(YEAR(TODAY()), MONTH(REGEXREPLACE(K4:K, "[.]", "/")), DAY(REGEXREPLACE(K4:K, "[.]", "/"))) > 0, YEAR(TODAY()) - YEAR(REGEXREPLACE(K4:K, "[.]", "/")) + 1, YEAR(TODAY()) - YEAR(REGEXREPLACE(K4:K, "[.]", "/"))), IF(LEN(K4:K) > 0, IF(TODAY() - DATE(YEAR(TODAY()), MONTH(K4:K), DAY(K4:K)) > 0, YEAR(TODAY()) - YEAR(K4:K) + 1, YEAR(TODAY()) - YEAR(K4:K)), "")))
Run Code Online (Sandbox Code Playgroud)

我正在使用TODAY(),我做了上面描述的重新计算设置. - >但不会自动刷新.:-(
它仅更新,如果我在函数查找范围内更改某个值.

所以我为此编写了一个Google脚本(工具 - >脚本编辑器......).

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetMaster = ss.getSheetByName("Master"); 
  var sortRange = sheetMaster.getRange(firstRow, firstColumn, lastRow, lastColumn);  

  sortRange.getCell(1, 2).setValue(sortRange.getCell(1, 2).getValue());
}
Run Code Online (Sandbox Code Playgroud)

您需要为组数字firstRow,firstColumn,lastRow,lastColumn

当电子表格打开时,脚本将处于活动状态,将一个单元格的内容再次写入同一个单元格.这足以触发TODAY()功能.

请查看Edward Moffett关于该链接的更多信息. 强制google工作表公式重新计算

最好的问候,
Christoph

  • 如果公式仅取决于自定义函数的结果,则这不起作用......如果有某种方法可以强制工作表一次性重新计算所有内容,那就太好了。 (4认同)

use*_*182 12

对我有用的是在第一列之前插入一列,然后立即将其删除。基本上,进行更改会影响工作表中的所有单元格,从而触发重新计算。

  • 这对我来说不起作用 https://webapps.stackexchange.com/questions/29283/how-to-refresh-a-cell-in-google-spreadsheet#comment137592_35970 (2认同)

cli*_*all 12

老问题……尽管如此,只需在工作表中的某处添加一个复选框。选中或取消选中它会刷新单元格公式。


Aar*_*oma 7

快速但手动


更新NOW()TODAY()RAND(),或RANDBETWEEN()

Backspace ?Del任何空单元格立即触发公式重新计算根据NOW()TODAY()RAND(),或RANDBETWEEN()(整个表格的所有工作表,像往常一样)。

(如果手头没有空单元格,您可以删除填充的单元格,然后使用Ctrl+撤消z。)

INDIRECT() 不幸的是,默认情况下,公式不会像这样更新。

更新INDIRECT()公式

您可以INDIRECT()通过将范围粘贴到自身上来更新公式的(范围)单元格:

  1. 选择单元格/范围
  2. Ctrl+C
  3. Ctrl+V

您可以在第 1 步中使用Ctrl+A选择整个当前工作表。但对于大工作表,其他 2 个操作每个可能需要几秒钟。
知道复制大范围的过程何时完成的技巧:在复制范围之前复制一些单个单元格:失去虚线边框的单个单元格将是大复制完成的通知。


Rya*_*yan 7

现有的答案都不适合我,但这种方法确实有效。

问题

我看到很多细胞说#REF!。这些是我使用“复制到 > 现有工作表”从另一个 Google Sheet 文档复制的工作表中的单元格。如果我在任何单元格中按 Enter,它会正确重新计算,但我不想对数百万个单元格执行此操作。

我的答案

我运行了这个recalcSheet()脚本。每个单元大约需要 0.5 秒,这非常慢,但比手动修复每个单元要快。

function recalcSheet(){  
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = spreadsheet.getSheetByName("put_your_sheet_name_here");  // https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename
  // var range = sheet.getSelection().getActiveRange();
  // var range = sheet.getRange('A6:D6');
  var range = sheet.getDataRange();  
  recalcRange(range, spreadsheet);
}

function recalcRange(range, spreadsheet){
  // following structure of https://stackoverflow.com/a/52123839/470749
  Logger.log('Range: ' + range.getA1Notation());
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  var startRow = range.getRow();
  var startCol = range.getColumn();
  Logger.log('row: ' + startRow);
  Logger.log('col: ' + startCol);
  Logger.log('numRows: ' + numRows);
  Logger.log('numCols: ' + numCols);

  for (var r = 1; r <= numRows; r+=1) {
    for (var c = 1; c <= numCols; c+=1) {
      var originalFormula = range.getCell(r, c).getFormula(); // https://developers.google.com/apps-script/reference/spreadsheet/range#getFormula()
      Logger.log(`r,c ${r}, ${c}; originalFormula: ${originalFormula}`);
      if(originalFormula){
        range.getCell(r, c).setFormula('');
        //SpreadsheetApp.flush(); // https://webapps.stackexchange.com/a/35970/27487
        range.getCell(r, c).setFormula(originalFormula);
      }
    }
  }
  spreadsheet.toast('Each cell in the range has been recalculated.', "Finished!"); // https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#toast(String)
}
Run Code Online (Sandbox Code Playgroud)