web-dev-qa-db-ja.com

その行のセルの値が0または空白の場合、Googleスプレッドシートの行を削除します

その行の列「C」に入力された値が0または空白の場合、Googleスプレッドシートの行全体を削除できるようにしたいと思います。これを達成するために書くことができる簡単なスクリプトはありますか?ありがとう!

21
Zack
function onEdit(e) {
  //Logger.log(JSON.stringify(e)); 
  //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}}
  try {
    var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit
    var s = ss.getActiveSheet();

    // Conditions are by sheet and a single cell in a certain column
    if (s.getName() == 'Sheet1' &&  // change to your own 
        e.range.columnStart == 3 && e.range.columnEnd == 3 &&  // only look at edits happening in col C which is 3
        e.range.rowStart == e.range.rowEnd ) {  // only look at single row edits which will equal a single cell
      checkCellValue(e); 
    }
  } catch (error) { Logger.log(error); }
};

function checkCellValue(e) {
  if ( !e.value || e.value == 0) {  // Delete if value is zero or empty
    e.source.getActiveSheet().deleteRow(e.range.rowStart);
  }
}

これは、シート全体の値ではなく、単一セル編集の値のみを見るようになりました。

21
Bryan P

Googleスプレッドシートの1つで同じことを行うために、このスクリプトを書きました。すべてのデータがスプレッドシートに含まれた後にスクリプトを実行できるようにしたかったので、スクリプトを実行するためのメニューオプションをスクリプトに追加しました。

/**
 * Deletes rows in the active spreadsheet that contain 0 or
 * a blank valuein column "C". 
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[2] == 0 || row[2] == '') {
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Remove rows where column C is 0 or blank",
    functionName : "readRows"
  }];
  sheet.addMenu("Script Center Menu", entries);
};

前にスプレッドシートをテストします。

enter image description here

メニューからスクリプトを実行:

enter image description here

スクリプトを実行した後:

enter image description here

17
Mike Grace

スクリプトを使用せずに簡単な解決策を提案できます!!

列Cに空のテキストがある行を削除するとします。列Cのシートでデータを並べ替えます([データメニュー]-> [列Cでシートを並べ替え]、[A]-> [Z])。 。

それらの行をすべて選択し、右クリック->行を削除するだけです。その後、必要な列に従ってデータを並べ替えることができます。できた.

13
roneo

スクリプトにいくつか問題があったので、回避策は「フィルター」ツールを使用することでした。

  1. すべてのスプレッドシートデータを選択
  2. フィルターツールアイコンをクリックします(ワイングラスのように見えます)
  3. 検索する列の最初のセルで、新しく使用可能なフィルターアイコンをクリックします。
  4. [条件でフィルター]を選択し、条件を設定します([テキストを含む]> [単語]を使用していました)

これにより、検索対象のWordを含む行が残り、Shiftキーを押しながらそれらを一括選択することで削除できます。右クリック>行を削除します。

5
Adam

これは私がなんとか仕事をすることができたものです。行が削除されたときに次の行がスキップされないように、シートを逆方向にループしたことがわかります。これが誰かの助けになることを願っています。

  function UpdateLog() {

  var returnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RetLog');
  var rowCount = returnSheet.getLastRow();

  for (i = rowCount; i > 0; i--) {
    var rrCell = 'G' + i;
    var cell = returnSheet.getRange(rrCell).getValue();
    if (cell > 0 ){
      logSheet.
      returnSheet.deleteRow(i);
    }
  }
}
3
MikeD

非常に簡単なリクエスト。これを試して :

 function try_It(){
 deleteRow(2); //// choose col = 2 for column C
 }

 function deleteRow(col){ // col is the index of the column to check for 0 or empty
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!='' && data[n][col]!=0){ targetData.Push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

[〜#〜] edit [〜#〜]質問を読み直す編集で質問が「ライブ」を求めているかどうかわかりませんデータが入力された後に適用する関数または関数(上記のように)...それは私にはあまり明確ではありません...ので、必要に応じてより正確に自由に感じてください;)

1
Serge insas

この単純なコードは私のために仕事をしました!

    function myFunction() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();  // get active spreadsheet

      var activeRow = ss.getActiveRange().getRowIndex();  // get active/selected row

var start=1;
var end=650;
var match='';
var match2=0;   //Edit this according to your choice.

     for (var i = start; i <= end; i++) {
      var columnC = ss.getRange("C"+i).getValue();
      if (columnC ==match  || columnC ==match2){ ss.deleteRow(i); }
     }
    }
0

もっと簡単な方法があります:

  1. filtering を使用して、削除する行のみを表示します。たとえば、行を削除したい列にはA、B、Cというカテゴリがありました。フィルタリングインターフェイスを介して、削除したいAとBのみを選択しました。
  2. すべての行を選択して削除します。これを行うと、私の例では、すべてのA行とB行を効果的に選択して削除しました。スプレッドシートに行が表示されなくなりました。
  3. フィルターをオフにします。これにより、C行が再表示されます。できた!

あなたの質問を注意深く読んで、私はこの解決策を思いつきました:

function onOpen() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // create menu
  var menu = [{name: "Evaluate Column C", functionName: "deleteRow"}];

  // add to menu
  ss.addMenu("Check", menu);
}

function deleteRow() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get active/selected row
  var activeRow = ss.getActiveRange().getRowIndex();

  // get content column C
  var columnC = ss.getRange("C"+activeRow).getValue();

  // evaluate whether content is blank or 0 (null)
  if (columnC == '' || columnC == 0) {
    ss.deleteRow(parseInt(activeRow));
  }
}

このスクリプトは、ファイルのロード時にメニューを作成し、列Cで設定された基準に基づいて行を削除できるようにします。またはnotです。

0