Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 将数据拉至文档中的特定工作表_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 将数据拉至文档中的特定工作表

Google apps script 将数据拉至文档中的特定工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我是谷歌电子表格上的脚本编辑新手,不是什么程序员。 我和谷歌文档一起工作已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我想做的是: 寻找一个完整的文档(包括几个表单,如“1”、“2”、“3”等,对应于一个月可以保存的天数),如果第7列显示了一个确定的值(在我的情况下,它将是RECEBER),则提取该行中的所有数据并写入为此目的创建的表单。 发生的事情是,我正在使用事件onEdit来触发这个函数。乍一看,这很理想,但在我的例子中,我从其他电子表格复制了大量数据,并且粘贴命令不会触发on

我是谷歌电子表格上的脚本编辑新手,不是什么程序员。 我和谷歌文档一起工作已经有一段时间了,它已经成为我日常活动中的一个重要工具。 我想做的是: 寻找一个完整的文档(包括几个表单,如“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);
  }
}
函数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
            }
        }
    }
}