将数据拉到文档中的特定工作表

时间:2013-09-30 23:37:44

标签: google-apps-script google-sheets

我是谷歌电子表格上的脚本编辑器的新手,而不是程序员。 我一直在使用谷歌文档已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我正在尝试做的是以下内容: 寻找一个完整的文件(有几张表,如“1”,“2”,“3”等,对应一个月可以容纳的天数),如果第7列显示确定的值(在我的情况下) ,它将是RECEBER),拉出该行中的所有数据并写入为此目的创建的工作表。 发生的事情是我正在使用onEdit事件触发此功能。乍一看,这将是理想的,但在我的情况下,我从其他电子表格复制了大量数据,粘贴命令不会触发onEdit事件。相反,我必须手动编辑单元格,以便将该行复制到另一个工作表上。 我可以只运行一次,一个月的整个日子都填满了,还有任何更改要做,但我真正想做的是立即将内容插入电子表格中。 / p>

我的代码还有另一个问题,它必须适合所有其他工作表,因为如果活动工作表等于“1”,if子句只执行完整操作。无论如何,我相信有一个简单的解决方案。

这是在网上发现的代码,它已经把我带到了中途:

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "1" && r.getColumn() == 7 && r.getValue() == "RECEBER") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("money");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
  }
}

我将感谢您提供的所有帮助。 提前谢谢。

Diogo Sousa

- 更新了12Oct -

我已经更改了代码的逻辑,并且正如patt0建议的那样,我从创建的菜单中运行脚本。我已经尝试调整代码,但我相信有一些部分是错误的。该脚本运行,但在目标表上根本没有写任何内容。

这是代码:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "RECEBER", functionName: "RECEBER"} ];
  ss.addMenu("Scripts", menuEntries);
}

function mustBeCopied(sheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNumber = parseInt(sheetName);
  if (sheetNumber <=31 && sheetNumber >=1)
    return true;
  return false;
}

function RECEBER() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = ss.getActiveRange();
  if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("money");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
  }
}

功能Mustbecopied,据我所知,只设置了合格范围(1到31); 函数RECEBER将确定第7列上的值是否满足条件(RECEBER),因此它可以检索所有行信息并将其移动到目标表。

也许问题是活动表单的事情..我可以利用自己的优势并将脚本应用于所选表格吗? 此外,如果我可以同时拥有这两个选项(无论是将其应用于选定的工作表还是整个文档),那么这将是非常好的,并且可以简化我的日常工作!

1 个答案:

答案 0 :(得分:0)

你的问题实际上是多个问题,我只讨论第二部分,第一部分有很多维度(如何有效地更新摘要表),我们可以讨论另一个问题。< / p>

为了确定是否需要复制特定工作表中的数据,您可以创建一个简单的函数,如果工作表满足条件是1到31之间的数字,则返回布尔值。

function mustBeCopied(sheetName) {
  var sheetNumber = parseInt(sheetName);
  if (sheetNumber <=31 && sheetNumber >=1)
    return true;
  return false;
}

请记住,名为“28.7”的表格符合条件。

你的onEdit()脚本的第一行看起来像这个

if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER")

请告诉我这是否适合您。

--- 10月14日---

据我所知,剩下的问题是当你的函数在onEdit上运行时,范围(活动范围)是刚刚编辑过的单元格。所以范围只有一个单元格。

为了运行脚本,您需要在选择菜单之前突出显示要复制的每个单元格,这至少可以说是乏味的

此外,如果您要复制的已定义范围(每页都相同),我们可以每次复制该范围,或者遍历列中的每一行以查找“RECEBER”并复制这些行。

此外我们可以尝试更新您的功能,以便遍历所有工作表与此类似。

var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < sheets.length; i::) {
    var s = sheets[i];
    if (mustBeCopied(s.getName()) {
        var range = s.getRange(someRow, 7, someNumOfRows);
        for (var j = 1; j <= someNumOfRows; j++) {
            if (range.getCell(j,1).getValue() == "RECEBER") {
                //YOUR COPY CODE
            }
        }
    }
} 

让我知道这是如何运作的。