2017-08-24 13 views
1

私のスプレッドシートは、フォームを使用して入力されたメインシートと、フォームから送信された応答を扱う人々のための他の複数のシートで構成されています。スクリプトは、レスポンスに記述されている項目のタイプに応じて、フォーム応答をこれらの他のシートに委譲します。 問題は、人物Aがそれぞれのシートからアイテムを削除したときに、メインシートで削除されないことです。 私の考えは、人物Aのシートの行「Q」の対応するセルにセットパスワードを入力すると、元のフォーム提出とタイムスタンプで項目を照合し、個人Aのシート内のアイテムのバージョンも削除しますメインシートとして。しかし、配列の行を指し示すように範囲を設定する場所を決めることはできません。私が試したすべてがデバッガで "undefined"を返送して何も削除しません。問題は、私が作った配列から行を得る方法がわからないことだと思います。以下の私のコードを参照してください:Google Appsスクリプトの配列から行を引き出す方法Googleシート

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 == "[email protected]") && (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

私はこれらが適切なコマンドです信じていません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=="[email protected]" && 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);//? 
     } 
     } 
    } 
} 

問題のマークが付いた行の機能について説明できますか?

+0

こんにちは、私はそれを修正したと信じています。しかし、私の問題は今、forループで集められた配列から行を取得することです。その上の任意のアイデア? – Mara

+0

おそらくあなたは修正して、あなたの質問を変更していないでしょう。しかし、これら2つの行のtoEditは定義されていません。 '// var toEdit = responseSheet.getRange(); <---配列全体の行を削除したいという印をつけるために配列から得た範囲に戻す方法がわからない responseSheet.deleteRow(toEdit); ' – Cooper

+0

どういう意味ですか?私がコメントアウトした部分は、配列の行を指すように正しく記述する方法がわからない行です。 – Mara

関連する問題