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工作表公式重新计算
use*_*182 12
对我有用的是在第一列之前插入一列,然后立即将其删除。基本上,进行更改会影响工作表中的所有单元格,从而触发重新计算。
NOW(),TODAY(),RAND(),或RANDBETWEEN()式按Backspace ?或Del任何空单元格立即触发公式重新计算根据NOW(),TODAY(),RAND(),或RANDBETWEEN()(整个表格的所有工作表,像往常一样)。
(如果手头没有空单元格,您可以删除填充的单元格,然后使用Ctrl+撤消z。)
INDIRECT() 不幸的是,默认情况下,公式不会像这样更新。
INDIRECT()公式您可以INDIRECT()通过将范围粘贴到自身上来更新公式的(范围)单元格:
您可以在第 1 步中使用Ctrl+A选择整个当前工作表。但对于大工作表,其他 2 个操作每个可能需要几秒钟。
知道复制大范围的过程何时完成的技巧:在复制范围之前复制一些单个单元格:失去虚线边框的单个单元格将是大复制完成的通知。
问题
我看到很多细胞说#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)