我是谷歌电子表格上的脚本编辑器的新手,而不是太多的程序员。我使用 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),因此它可以检索所有行信息并将其移动到目标工作表。
也许麻烦是活动表的事情..我可以利用自己的优势并将脚本应用于选定的表吗?此外,如果我可以同时选择两个选项(是否将其应用于选定的工作表或整个文档),那就太好了,并且大大简化了我的日常工作!