Google apps script 将数据拉至文档中的特定工作表
我是谷歌电子表格上的脚本编辑新手,不是什么程序员。 我和谷歌文档一起工作已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我想做的是: 寻找一个完整的文档(包括几个表单,如“1”、“2”、“3”等,对应于一个月可以保存的天数),如果第7列显示了一个确定的值(在我的情况下,它将是RECEBER),则提取该行中的所有数据并写入为此目的创建的表单。 发生的事情是,我正在使用事件onEdit来触发这个函数。乍一看,这很理想,但在我的例子中,我从其他电子表格复制了大量数据,并且粘贴命令不会触发onEdit事件。相反,我必须手动编辑单元格,以便将该行复制到另一张图纸上。 我可以只运行一次,一旦一个月的所有日子都被填满了,还有任何需要做的更改,但我真正想做的是,一旦内容被插入电子表格,立即运行它 我的代码还有另一个问题,它必须适合并适应所有其他工作表,因为if子句只在活动工作表等于“1”时执行完整操作。无论如何,我相信有一个简单的解决办法 以下是在网上找到的代码,我已经花了一半的时间:Google apps script 将数据拉至文档中的特定工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我是谷歌电子表格上的脚本编辑新手,不是什么程序员。 我和谷歌文档一起工作已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我想做的是: 寻找一个完整的文档(包括几个表单,如“1”、“2”、“3”等,对应于一个月可以保存的天数),如果第7列显示了一个确定的值(在我的情况下,它将是RECEBER),则提取该行中的所有数据并写入为此目的创建的表单。 发生的事情是,我正在使用事件onEdit来触发这个函数。乍一看,这很理想,但在我的例子中,我从其他电子表格复制了大量数据,并且粘贴命令不会触发on
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);
}
}
函数onOpen(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var menuEntries=[{name:“RECEBER”,functionName:“RECEBER”}];
ss.addMenu(“脚本”,菜单);
}
必须复制函数(sheetName){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheetNumber=parseInt(sheetName);
如果(图纸编号=1)
返回true;
返回false;
}
函数接收器(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s=ss.getActiveSheet();
var r=ss.getActiveRange();
if(必须复制(s.getName())&r.getColumn()=7&r.getValue()=RECEBER){
var row=r.getRow();
var numColumns=s.getLastColumn();
var targetSheet=ss.getSheetByName(“货币”);
var target=targetSheet.getRange(targetSheet.getLastRow()+1,1);
s、 getRange(行,1,1,numColumns).copyTo(目标);
}
}
从我的观点来看,函数必须是copied,它只设置了表的范围(1到31);
函数RECEBER将确定第7列上的值是否满足条件(RECEBER),因此它可以检索所有行信息并将其移动到目标工作表
也许问题在于工作表的问题。。我是否可以根据自己的优势使用eit并将脚本应用于所选的工作表?
另外,如果我能同时拥有这两个选项(无论是将其应用于所选的工作表还是整个文档),那将非常好,并大大简化我的日常工作 你的问题实际上是一个问题中的多个问题,我将只讨论第二部分,第一部分有很多方面(如何有效地更新汇总表),我们可以用另一个问题来讨论 为了确定是否需要复制特定工作表中的数据,可以创建一个简单函数,如果工作表满足1到31之间的数字的条件,该函数将返回布尔值
function mustBeCopied(sheetName) {
var sheetNumber = parseInt(sheetName);
if (sheetNumber <=31 && sheetNumber >=1)
return true;
return false;
}
让我知道这是否适合你
---10月14日---
就我所见,剩下的问题是,当您的函数运行OneEdit时,范围(活动范围)就是刚刚编辑的单元格。所以范围只有一个细胞
为了让scrip运行,您需要在选择菜单之前高亮显示要复制的每个单元格,至少可以说这会很乏味
此外,如果定义了要复制的范围(在每个页面上都是相同的),我们可以每次复制该范围,或者遍历列中的每一行以查找“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
}
}
}
}
var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();
对于(变量i=0;i 对于(var j=1;j感谢您的快速回复。我使用了您的代码,它工作得完美无缺。现在它可以适应我想要的任何工作表范围,而无需每次我想将代码应用到新工作表时都更改代码。我只是认为每当我将新内容粘贴到从其他电子表格获取的文档上时,onEdit事件都应该响应。如ne所示正在插入数据,应将其解释为对工作表的有效编辑。是否有任何解决方法?非常感谢您的时间和关注。如果每次打开电子表格时我都可以运行此脚本,可能会更好。我尝试将OneEdit与onOpen交换,但它似乎无法运行。无论如何,这将是一个好方法d想法,每次打开电子表格时,脚本都会运行并在目标工作表上显示最新结果。欢迎对此发表任何评论。顺便问一下,我是否在适当的字段中回复?不幸的是,副本和过去不会触发onEdit()。您可以有一个菜单来启动更新,您需要提供范围信息以仅复制需要更新的内容,并且不复制行两次(或确保覆盖)。因此,当您打开工作表时,菜单将添加到其中,然后您可以调用更新功能:菜单教程在这里:这是一个非常好的主意。我
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
}
}
}
}