如何从Google应用脚本Google工作表

时间:2017-08-24 20:56:25

标签: google-apps-script google-sheets google-form

我的电子表格由一张主要工作表组成,该工作表使用表单和其他几张工作表填充,以供处理通过表单提交的答案的人员使用。脚本根据响应中描述的项目类型将表单响应委派给这些其他工作表。 问题是,当人员A从他们各自的工作表中删除一个项目时,它不会在主工作表中删除。 我的想法是,当您在人员A的工作表中的“Q”行中的相应单元格中键入设置的密码时,它会按时间戳匹配原始表单提交的项目,并删除人员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 个答案:

答案 0 :(得分:1)

我不相信这些是正确的命令delRow.deleteRow();actCell.deleteRow();看看documentation;

好的,我为你重写了这个功能,但我仍然想知道几行。

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);//?
        }  
      }
    }  
}

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