【问题标题】:Pasting Values to Work as Folmula (Apps Script for Google Sheets)粘贴值以用作公式(Google 表格的应用程序脚本)
【发布时间】:2019-03-18 15:25:10
【问题描述】:

我需要过滤最新工作表中的数据(每天都会自动创建一个新工作表)。我使用的公式是

=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();

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    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);
    ...
    

    【讨论】:

    • 谢谢,但如果我使用 PASTE_FORMULA,我最终会得到 =CONCATENATE 公式,而不是我想要的底层 =FILTER 公式。如果我使用 PASTE_VALUES 我得到正确的公式,但作为文本,这很奇怪,因为它在开头有 = 和正确的语法。我还尝试将其作为值粘贴到另一个单元格中,然后从新单元格中复制粘贴为公式,但我得到相同的结果:(
    • 在脚本中构造公式有效。我知道该网站说不要使用 cmets 说“谢谢”,而是说谢谢。你帮了我很多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多