1

Googleスプレッドシート、フォーム、Appsスクリプトを使用した簡単なメール管理システムで作業していますが、Javascript/Google Apps Scriptを初めて使用しています。Google Apps Scriptを使用してGoogleスプレッドシートの条件に一致するすべての行を削除するにはどうすればよいですか?

だから、私はこのようになりますこと、自分の名前、電子メールやグループをリスト、連絡先とのスプレッドシートを持っている:

| Name | Email    | Group | 
|-------|-------------------|--------| 
| John | [email protected] | A  | 
| Bill | [email protected] | A  | 
| Janet | [email protected] | B  | 
| Mary | [email protected] | B  | 
| Mary | [email protected] | Delete | 
| Bill | [email protected] | Delete | 
| Janet | [email protected] | A  | 

私はプログラム的」とマークされているすべてのメールを見つけたスクリプトを記述しようとしています削除 "し、それらの電子メールを含むすべての行を削除します。この場合、[email protected][email protected]を含むすべての行を削除し、JohnとJanetを保持する必要があります。予想される出力は:

| Name | Email    | Group | 
|-------|-------------------|--------| 
| John | [email protected] | A  | 
| Janet | [email protected] | B  | 
| Janet | [email protected] | A  | 

問題は、私はこのように私のシートをフィルタリングする方法を見つけることができないということで、私のスクリプトは、私が削除したい行を含め、すべてのものをコピーし続けます。これは私がこれまでに書いたコードです:私は解決策は非常に簡単です確信している

function removeDelRows() { 

    var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet 
    var data = ss.getDataRange().getValues(); // Get values in active sheet 

    var toDelete = new Array(); 
    var newData = new Array(); 

    // Put in toDelete array all emails marked as "Delete" 
    for (var i = 0; i < data.length; i++) { 
     if (data[i][2] == "Delete") { 
      toDelete.push(data[i][1]); 
     } 
    } 
    // !BUGGY! 
    // Find all rows that contains emails to be deleted and remove them 
    for (var j = 0; j < data.length; j++) { 
     for (var k = 0; k < toDelete.length; k++) { 
      if(data[j][1] == toDelete[k]){} // Do nothing 
      else{ 
       newData.push(data[j]); // THIS CONDITION IS NOT BEHAVING AS EXPECTED; NEWDATA IS A COPY OF DATA 
      } 
     } 
    } 
    Logger.log(newData); // newData should contains only rows that do not match toDelete ones 

    // Delete everything else 
    sheet.clearContents(); 
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData); 
} 

が、私は時間と時間のために私の頭を叩いてきたと私はこれを把握することはできません!

答えて

0

deleteRow()の使用はいかがですか?

var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet 
    var data = ss.getDataRange().getValues(); // Get values in active sheet 

    nextLine: for(var i = data.length-1; i >=0; i--) { 
     if(data[i][2] !== "Delete") continue nextLine; 
     ss.deleteRow(i+1); 
    } 
+0

ありがとうございます!私はあなたのバージョンをちょっと修正しましたが、今は完全に動作します! –

+0

それは動作しているので、答えとしてマークするのを忘れないでください。灰色のチェックマークをクリックしてください – noogui

+0

このソリューションには、削除されるすべての行に対してAPI呼び出しが含まれています。何千ものレコードが10枚入っているシートの場合、これは最適な解決策ではないかもしれません。 –

関連する問題