2013-09-30 22 views
0

我是Google电子表格中的一位新的脚本编辑器,而不是程序员。 我一直在使用谷歌文档已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我想要做的事情如下: 寻找一个整体文档(带有整体表单,例如“1”,“2”,“3”等等,对应于一个月可以保存的天数),如果列7显示一个确定的值(在我的情况下,它将是RECEBER),拉出该行的所有数据并写入为此目的而创建的表单中。 发生什么事是我正在使用事件onEdit触发此功能。乍一看,这将是理想的,但在我的情况下,我复制了其他电子表格中的大量数据,并且paste命令不会触发onEdit事件。相反,我必须手动编辑单元格才能将该行复制到另一个表单上。 我只能运行一次,一旦这个月的整个日子都满了,还有什么变化可做,但我真正想要做的就是立即将内容插入到电子表格中。将数据提取到文档中的特定工作表

我的代码还有另一个问题,它必须适合所有其他工作表,因为如果活动工作表等于“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); 
    } 
} 

我会感激所有帮助你可以给。 在此先感谢。

迪奥戈·索萨

- 更新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

你的问题真的是多个问题之一,我只处理第二部分,第一部分有很多维度(如何有效更新汇总表),我们可以与另一个问题讨论。

为了确定是否需要复制特定表中的数据,则可以创建一个简单的函数,返回一个布尔值,如果片满足,它是一个数字的条件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 
      } 
     } 
    } 
} 

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

+0

感谢您的快速回复。 –

+0

我用你的代码,它的工作完美无瑕。现在它可以适应我希望的任何纸张范围,而无需每次将其应用于新纸张时更改代码。 我只是认为,只要将新内容粘贴到从其他电子表格中提取的文档上,onEdit事件就会响应。在插入新数据时,应将其解释为对工作表的有效编辑。有没有解决方法? 非常感谢您的时间和关注。 –

+0

也许如果我每次打开电子表格都可以运行这个脚本,那会更好。我尝试用onOpen交换onEdit,但似乎没有运行。 无论如何,这是一个好主意,因为每次打开电子表格时,脚本都会运行,并在targer表单上显示最新结果。对此有任何意见都欢迎。 顺便说一句,我回复在拨款领域? –

相关问题