我是谷歌电子表格上的脚本编辑器的新手,而不是程序员。 我一直在使用谷歌文档已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我正在尝试做的是以下内容: 寻找一个完整的文件(有几张表,如“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),因此它可以检索所有行信息并将其移动到目标表。
也许问题是活动表单的事情..我可以利用自己的优势并将脚本应用于所选表格吗? 此外,如果我可以同时拥有这两个选项(无论是将其应用于选定的工作表还是整个文档),那么这将是非常好的,并且可以简化我的日常工作!
答案 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
}
}
}
}
让我知道这是如何运作的。