我需要过滤最新工作表中的数据(每天自动创建一个新数据)。我使用的公式是
=FILTER('S&T 18/3/2019'!N:N;ISBLANK('S&T 18/3/2019'!N:N)=FALSE)
并且它有效,所以在另一个单元格中,我已经编写了另一个公式,使第一个公式保持最新状态:
=CONCATENATE("=filter('S&T ";TEXT(TODAY();"d/m/yyyy");"'!N:N;ISBLANK('S&T";TEXT(TODAY();"d/m/yyyy");"'!N:N)=FALSE)")
在应用程序脚本中,我使用以下代码将第二个公式粘贴为值,它也可以工作,但在其单元格中,它显示为文本而不是公式。如果我从头开始手动删除=
然后再添加它就可以完美地运行。这个想法是让它独立工作。有人可以帮忙吗?
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Test Filtro'), true);
spreadsheet.getRange('D1').activate();
spreadsheet.getRange('D1').copyTo(spreadsheet.getRange('E2'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
spreadsheet.getRange('E2').activateAsCurrentCell();
Range#copyTo
方法接受2个可选参数,CopyPasteType
以及数据是否应该转置。您的代码无法复制为公式,因为您使用CopyPasteType
枚举PASTE_VALUES
。要复制公式,您应该使用PASTE_FORMULA
。
枚举CopyPasteType
PASTE_NORMAL Enum Paste values, formulas, formats and merges. PASTE_FORMULA Enum Paste the formulas only. PASTE_VALUES Enum Paste the values ONLY without formats, formulas or merges.
您的代码将如下所示:
...
var destCell = spreadsheet.getRange("E2");
spreadsheet.getRange("D1").copyTo(destCell, SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
destCell.activateAsCurrentCell();
...
由于您尝试进行“双重粘贴”(您的源数据是在评估时创建公式的公式,并且您想要编写创建的公式),您需要粘贴原始单元格的值,然后重新 - 检查输出(您想要的公式)并将其粘贴为公式:
...
const AS = SpreadsheetApp.CopyPasteType;
var destCell = spreadsheet.getRange("E2");
spreadsheet.getRange("D1").copyTo(destCell, AS.PASTE_VALUES, false); // Compute the desired formula, via formula-to-value conversion.
SpreadsheetApp.flush(); // Force the first copy to occur.
destCell.copyTo(destCell, AS.PASTE_FORMULA, false); // Activate the computed formula.
destCell.activateAsCurrentCell();
...
通过在脚本中构造公式,您可以完全避免第一个范围副本。
...
var TODAY = Utilities.formatDate(new Date(), "your timezone", "your format string here");
var myFormula = "=FILTER('S&T " + TODAY + "'!N:N;ISBLANK('S&T " + TODAY + "'!N:N)=FALSE)";
destCell.setFormula(myFormula);
...