如何将google工作表的最后(n)行复制到新工作表

时间:2015-02-15 01:18:11

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

我是Google Apps和Google表单的新手,非常感谢您的帮助。我有一张google工作表,其中包含表中的一些数据,这些数据只是一个日期列,然后是从该日期收集的几列数据,每天数据都有一个新行。我希望将最近7天,30天,60天等复制到新的表格中。基本上将表的最后(x)行复制到新表中,我可以在其中变化(x)。

是否有一个简单的功能,我可以在新工作表上使用从表中获取所需的(x)行。 或者我必须使用脚本。如果是这样,我该怎么办呢。

非常感谢任何回复。

谢谢

3 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:1)

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

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

选择工具 SCRIPT 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文件: 从FILE菜单中,选择NEW - 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>

添加所有代码后刷新电子表格,并显示新的自定义菜单。使用自定义菜单显示对话框。

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

获取工作表名称的代码

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

答案 2 :(得分:0)

一个起点是查看三个FILTER函数。

  • FILTER
  • SORT
  • UNIQUE

以下是Google电子表格功能列表的链接:

Google Support - Spreadsheet Function List

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

无论哪种方式,都有可能。