【问题标题】:How to copy the last (n)rows of a google sheet to a new sheet如何将谷歌工作表的最后(n)行复制到新工作表
【发布时间】:2015-02-15 01:18:10
【问题描述】:

我是 Google Apps 和 Google 表格的新手,希望能得到一些帮助。我有一个谷歌表格,表格中包含一些数据,该表格只是一个日期列,然后是从该日期收集的几列数据,其中每一天的数据都有一个新行。我希望将最近 7 天、30 天、60 天等复制到新工作表中。基本上将表格的最后 (x) 行复制到一个新工作表中,我可以在其中更改 (x)。

是否有一个简单的函数可以在新工作表上使用以从表中获取所需的 (x) 行。 还是我必须使用脚本。如果是这样,我该如何进行。

任何回复将不胜感激。

谢谢

【问题讨论】:

  • 你可以搜索类似的问题,比如这个:StackOverflow Filter by Date
  • 另外,这个:SO - Filter by date column 如果你把一些东西放在一起,并提供一个指向包含一些虚拟数据的工作表的链接,那么有人可以提供帮助。
  • 例如,我想将表格 1 上 A 和 B 列中的最后 7 天数据自动复制到表格 2,并将过去 30 天的数据复制到以下文档的表格 3:docs.google.com/spreadsheets/d/…
  • 您可以从自定义菜单运行脚本。当电子表格打开时,可以将自定义菜单添加到电子表格中。您更喜欢电子表格公式吗?
  • 我将不胜感激任何解决方案。谢谢。

标签: function google-apps-script google-sheets google-apps


【解决方案1】:

我在为我工作的学校制定的活动计划中使用了相同的技巧。在我创建的版本中,我为今天和接下来的 7 天创建了一张工作表。 https://docs.google.com/spreadsheet/ccc?key=0AnQ7SpwUoM8odDRKZWE2eVh4QTNzOWsyQmlkb3JvRVE&usp=sharing#gid=10

下面是我接下来 7 天使用的过滤功能。

=filter('All Events'!A:H,('All Events'!A1:A1654=DATEVALUE(now()))+('All Events'!A1:A1654=DATEVALUE(now()+1))+('All Events'!A1:A1654=DATEVALUE(now()+2))+('All Events'!A1:A1654=DATEVALUE(now()+3))+('All Events'!A1:A1654=DATEVALUE(now()+4))+('All Events'!A1:A1654=DATEVALUE(now()+5))+('All Events'!A1:A1654=DATEVALUE(now()+6))+('All Events'!A1:A1654=DATEVALUE(now()+7)))

【讨论】:

    【解决方案2】:

    要添加菜单并运行代码,我创建了以下代码和说明:

    添加一个在电子表格打开时运行的函数:

    选择TOOLSSCRIPT EDITOR,代码编辑器将打开。粘贴到这个onOpen() 函数中。

    function onOpen() {
    
      SpreadsheetApp.getUi()
          .createMenu('Custom Menu')
          .addItem('Display User Dialog', 'displayUserDialog')
          .addToUi();
    };
    

    当您打开电子表格时,该代码将运行。您将看到一个新的菜单项。 该代码设置为在您从自定义菜单中选择“显示用户对话框”时触发更多代码。您需要添加更多代码。添加此功能:

    function displayUserDialog() {
    
      //Logger.log('displayUserDialog ran: ');
    
      var html = HtmlService.createTemplateFromFile('Dialog Copy Choices')
        .evaluate()
        .setSandboxMode(HtmlService.SandboxMode.NATIVE)
        .setWidth(500)
        .setHeight(300);
    
      SpreadsheetApp.getUi()
        .showModalDialog(html, 'My custom dialog');
    };
    

    上述两个函数进入一个gs 脚本文件。我认为通常会自动创建一个新的脚本文件名称:Code.gs

    创建一个新的 HTML 文件: 从文件菜单中,选择新建 - HTML

    名为“对话框复制选择”的 HTML 文件

    <div id="outer" style="padding:1;"/>
    
    <div>
        <br>Sheet To Copy To:<br>
        <select id="idSheetNames">
          <?!= getSheetNames(); ?>
        </select>
        <br>
        <br>
        <div>Copy To:</div>
        <input id="idToCol" type='text' placeholder='Column To Copy to:'>
        <br>
        <input id="idToRow" type='text' placeholder='Row To Copy to:'>
        <br>
        <br>
        <div>Copy From:</div>
        <input id="idFromStart" type='text' placeholder='A1'>
        <br>
        <input id="idFromEnd" type='text' placeholder='D20:'>
        <br>
        <br> 
        <input type="button" value="Copy Cells" id="idCopyBtn" onclick="myFunction()">
    </div>
    
    <script>
    
    function myFunction() {
      var sheetToGetData = document.getElementById("idSheetNames").value;
      var copyToRow = document.getElementById("idToRow").value;
      var copyToCol = document.getElementById("idToCol").value;
    
      var copyFromStart = document.getElementById("idFromStart").value;
      var copyFromEnd = document.getElementById("idFromEnd").value;
    
      //console.log("values of variables: " + sheetToGetData + " : " + copyToCol + " : " + copyToRow + " : " +  copyFromStart + " : " +  copyFromEnd);
    
      google.script.run.gsCopyData(sheetToGetData, copyToCol, copyToRow, copyFromStart, copyFromEnd);
      google.script.host.close();
    };
    </script>
    

    添加所有代码后刷新电子表格,应该会出现一个新的自定义菜单。使用自定义菜单显示对话框。

    自定义对话框在下拉字段中显示电子表格中的所有工作表。下拉菜单允许您选择要将数据复制到的工作表:

    获取工作表名称的 gs 代码

    function getSheetNames() {
      var allSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    
      var howManySheets = allSheets.length;
      var sheetNames = [];
      var htmlSelectOptions = "";
      var thisName = "";
    
      for (var i = 0;i < howManySheets; i++) {
        thisName = allSheets[i].getName();
        htmlSelectOptions += '<option value="' + thisName + '">' + thisName + '</option>';
      };
    
      return htmlSelectOptions;
    };
    

    gs 代码复制数据

    function gsCopyData(sheetToGetData, copyToCol, copyToRow, copyFromStart, copyFromEnd) {
      //Logger.log(sheetToGetData + " : " + copyToCol + " : " + copyToRow + " : " + copyFromStart + " : " + copyFromEnd);
      //Logger.log("gsCopyData ran");
    
      var alphaBet = 'abcdefghijklmnopqrstuvwxyz';
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
    
      var rowStartCopy = Number(copyFromStart.slice(1));
      var colStartCopy = copyFromStart.slice(0,1);
      colStartCopy = 1 + alphaBet.indexOf(colStartCopy.toLowerCase());
    
      var rowEndCopy = Number(copyFromEnd.slice(1));
      var colEndCopy = copyFromEnd.slice(0,1);
      colEndCopy = 1 + alphaBet.indexOf(colEndCopy.toLowerCase());
    
      var numRows = rowEndCopy - rowStartCopy + 1;
      var numColumns = colEndCopy - colStartCopy + 1;
    
      var rangeToCopy = sheet.getRange(rowStartCopy, colStartCopy, numRows, numColumns);
    
      copyToCol = alphaBet.indexOf(copyToCol.toLowerCase()) + 1;
    
      var destinationSheet = ss.getSheetByName(sheetToGetData);
    
      //Logger.log(destinationSheet + copyToCol + numColumns + copyToRow + numRows);
    
      rangeToCopy.copyValuesToRange(destinationSheet, copyToCol, numColumns, copyToRow, numRows);
    };
    

    【讨论】:

    • 谢谢桑迪@sandygood 我从你的回答中学到了很多东西。以下是我按照您的说明创建的电子表格的链接:docs.google.com/spreadsheets/d/…
    • 我在最后添加了一些实际执行复制的代码。完成所有工作的方法是:copyValuesToRange(destinationSheet, copyToCol, numColumns, copyToRow, numRows) 这是代码的关键行。其他一切都只是为运行那行代码做准备。
    【解决方案3】:

    首先要查看三个 FILTER 函数。

    • 过滤器
    • 排序
    • 独一无二的

    这里是 Google 电子表格函数列表的链接:

    Google Support - Spreadsheet Function List

    我确信有一种方法可以使用函数来过滤您想要的数据。如果你想要更自动化的东西,你需要编程一些东西。那将是更多的工作。

    无论如何,这是可能的。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多