0

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

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

这是在网上找到的已经让我半途而废的代码:

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

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

迪奥戈·索萨

-- 10 月 12 日更新 --

我已经更改了代码的逻辑,并且按照 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),因此它可以检索所有行信息并将其移动到目标工作表。

也许麻烦是活动表的事情..我可以利用自己的优势并将脚本应用于选定的表吗?此外,如果我可以同时选择两个选项(是否将其应用于选定的工作表或整个文档),那就太好了,并且大大简化了我的日常工作!

4

1 回答 1

0

你的问题确实是多个问题,我只处理第二部分,第一部分有相当多的维度(如何有效地更新摘要表),我们也许可以与另一个问题讨论。

为了确定是否需要复制特定工作表中的数据,您可以创建一个简单的函数,如果工作表满足它是 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
            }
        }
    }
} 

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

于 2013-10-01T05:28:54.467 回答