我需要从最新的工作表中过滤数据(每天都会自动创建一个新的表)。我用的公式是
=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();
发布于 2019-03-18 08:44:12
Range#copyTo
方法接受两个可选参数,CopyPasteType
和是否应该转换数据。您的代码无法作为公式进行复制,因为您使用了CopyPasteType
枚举PASTE_VALUES
。要复制公式,应该使用PASTE_FORMULA
。
Enum CopyPasteType PASTE_NORMAL Enum粘贴值、公式、格式和合并。PASTE_FORMULA Enum只粘贴公式。PASTE_VALUES Enum只粘贴没有格式、公式或合并的值。
然后,您的代码将类似于:
...
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);
...
https://stackoverflow.com/questions/55224715
复制