当前位置: 首页 > 知识库问答 >
问题:

如何从Google应用程序脚本Google sheets中的数组中提取行

郑乐池
2023-03-14

我的电子表格由一个主表组成,该主表使用一个表单填充,再加上几个其他表单,供处理通过表单提交的回复的人员使用。脚本根据响应中描述的项目类型,将表单响应委托给这些其他工作表。问题是,当人员A从各自的工作表中删除项目时,它不会在主工作表中删除。我的想法是,当您在Person a的工作表的“Q”行中的相应单元格中键入设置的密码时,它会按时间戳将项目与原始表单提交匹配,并删除Person a工作表中项目的版本以及主工作表。但是,我不知道如何设置范围以使其指向数组中的行。我尝试的所有操作都已在调试器中返回“undefined”,并且不会删除任何内容。我认为问题在于我不知道如何从我创建的数组中获取行。请参见下面的我的代码:

   function onEdit() {//copies edited items from individual selector sheets back onto main spreadsheet

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var actSheet = ss.getActiveSheet();
    var responseSheet = ss.getSheetByName("Item Request");
    var actCell = actSheet.getActiveCell();
    var actRow = actCell.getRow();
    var actVal = actCell.getValue();
    var actLoc = actCell.getA1Notation();
    var last = actSheet.getLastRow();
    var respLast = responseSheet.getLastRow();
    var dataA = responseSheet.getRange(1, 1, respLast, 1).getValues(); //compiles an array of data found in column A through last row in response sheet
    var tstamp1 = actSheet.getRange(actCell.getRow(), 1);
    var tsVal1 = tstamp1.getValue();
    var colEdit = actCell.getColumn();

    //===========THIS IS WHERE I'M STUCK=======================
 if ((actVal == "p@ssword") && (colEdit == 17)) {
      for (i = 1; i < dataA.length; i++) {
       if (dataA[i][0].toString == tsVal1.toString()) { 
         responseSheet.deleteRow(i + 1);
         actSheet.deleteRow(actRow);
         break;
       }
      }
    }

       else if (colEdit == 15) { //checks the array to see if the edit was made to the "O" column

            for (i = 1; i < dataA.length; i++) {//checking for timestamp match and copies entry 
                if (dataA[i][0].toString() == tsVal1.toString()) {
                    var toEdit = responseSheet.getRange(i + 1, 16);
                    toEdit.setValue(actVal);
                }
            }
       } 

     else if (colEdit == 16) { // checks the array to see if the edit was made in the "P" column

         for (i = 1; i < dataA.length; i++) {//checking for timestamp match and copies entry
             if (dataA[i][0].toString() == tsVal1.toString()) {
                var toEdit = responseSheet.getRange(i + 1, 17);
                toEdit.setValue(actVal);
             }
         }
     }  

    else {return;}
}//end onEdit

共有1个答案

谢旻
2023-03-14

我不相信这些是正确的命令。deleteRow();actCell。deleteRow() 查看文档;

好的,我为你们重写了这个函数,但我仍然在想有几行。

function onEdit(e) 
{
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var actSheet = ss.getActiveSheet();
    var responseSheet = ss.getSheetByName("Item Request");
    var actCell = actSheet.getActiveCell();
    var actRow = actCell.getRow();
    var actVal = actCell.getValue();
    var colEdit = actCell.getColumn();
    var respLast = responseSheet.getLastRow();
    var dataA = responseSheet.getRange(1, 1, respLast, 1).getValues(); 
    var tstamp1 = actSheet.getRange(actRow, 1);
    var tsVal1 = tstamp1.getValue();

    for(var i=0;i<dataA.length;i++)
    {
      if(new Date(dataA[i][0]).valueOf()==new Date(tsVal1).valueOf()) 
      { 
        if (actVal=="p@ssword" && colEdit==17) 
        {
          responseSheet.deleteRow(i + 1);
          actSheet.deleteRow(actRow);     
        }
        else if(colEdit==15) 
        { 
          var toEdit = responseSheet.getRange(i + 1, 16);//?
          toEdit.setValue(actVal);//?
        } 
        else if (colEdit == 16) 
        {
          var toEdit = responseSheet.getRange(i + 1, 17);//?
          toEdit.setValue(actVal);//?
        }  
      }
    }  
}

你能解释一下带有问题标记注释的行的功能吗?

 类似资料:
  • 把所有信息写到电子表格中。 删除唯一的标记信息以防止重复运行。 然后使用form mule addon从电子表格发送电子邮件。 到目前为止,我已经处理了第1步(简单),而第2步和第3步(我不是一个编码器,我可以读、解串和黑。从头开始写是完全不同的事情)。我以前处理过4次,我认为这是最好的处理方法。 通过脚本,我将信息提取到电子表格中,通过插件,我使用电子表格中的信息发送电子邮件。 这是我到目前为止

  • 我使用SpreadSheet中的脚本在活动行下面添加行,并从活动行复制内容。在PC上,我可以通过图像/绘图触发脚本,它工作得很好。但是我不知道如何让它在iOS应用程序中工作,在应用程序中,图像触发不起作用,从一个应用程序复制内容到另一个应用程序是噩梦。我尝试了onEdit和isChecked为每一行,但它会给我新的行在每个编辑。你能帮忙吗? https://docs.google.com/spre

  • 我把我的应用放到Google Play,现在我做一些事情,比如添加新功能,新UI等,然后重新上传应用到Google Play。 所以我想,当用户启动应用程序时,如果有新的更新,显示一个对话框提醒用户,允许他们更新最新版本。 谷歌似乎没有提供任何API来获得应用版本,那么有什么解决方案可以做吗?

  • 我试图找出最健壮的方法,从行提要,而不是单元格提要来确定谷歌表格中一列的顺序位置。 例如,我有以下电子表格: 在我的代码中,我能够通过谷歌的工作表API成功地从工作表中获取基于行的提要。我为提要中的每一行返回的对象包括各种属性,其中大多数是标题行中的值。例如,一个单行对象看起来像: 我想从基于行的提要中找到任何给定列的顺序位置,但是如何做到这一点似乎并不明显。似乎对象的属性是根据它们在标题行中的位

  • 问题内容: 我有一个变量,如下所示: 该变量中包含许多城镇数据。如何有效地从数据中提取第三个元素?我,下面会是什么? 如果我想将两个值都存储在数组中怎么办?那是 我是Java的新手。我希望有一种不使用for循环的方法。 问题答案: 在较新的浏览器上,您可以使用,否则可以避免使用循环。 但是for循环更兼容。

  • 我正在为谷歌表发送数据到服务器的脚本。目标Google Sheets文档有几个工作表。每个工作表必须有自己的菜单。所以我已经搜索了当活动表更改时触发的任何触发器,但我不能。 如何获取工作表切换事件? 谢谢你:) 使现代化我有这个功能: 但我想用函数替换onOpen,该函数将由激活工作表时触发的某个事件调用。 更新2. 我根据@Cooper的回答应用更改。现在,onOpen仍然可以正常工作,但是on