その行の列「C」に入力された値が0または空白の場合、Googleスプレッドシートの行全体を削除できるようにしたいと思います。これを達成するために私が書くことができる簡単なスクリプトはありますか? ありがとう!
11 に答える
スクリプトを使わずに簡単な解決策を提案できます!!
列 C に空のテキストがある行を削除したいとします。データを並べ替え ([データ メニュー] -> [列 C でシートを並べ替える]、[A] -> [Z])、列 C のシートでデータを並べ替えると、すべての空のテキスト行がまとめて使用できるようになります。 .
これらの行をまとめて選択し、右クリック -> 行を削除します。次に、必要な列に従ってデータを再ソートできます。終わり。
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);
}
}
これは、シート全体の値ではなく、現在単一のセル編集からの値のみを確認します。
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);
};
次の前にスプレッドシートをテストします。
メニューからスクリプトを実行:
スクリプトを実行した後:
スクリプトにいくつか問題があったため、回避策として「フィルター」ツールを使用しました。
- すべてのスプレッドシート データを選択
- フィルター ツール アイコン (ワイングラスのようなアイコン) をクリックします。
- 検索する列の最初のセルで、新しく利用可能になったフィルター アイコンをクリックします。
- 「条件でフィルター」を選択 > 条件を設定 (「テキストを含む」 > 「単語」を使用していました)
これにより、検索する単語を含む行が残り、シフトキーを押しながらそれらを一括選択することで削除できます>右クリック>行を削除します。
これは私がなんとか仕事をすることができたものです。行が削除されたときに次の行がスキップされないように、シートを逆方向にループしたことがわかります。これが誰かに役立つことを願っています。
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);
}
}
}
非常に単純な要求。これを試して :
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 :質問を読み直す 質問が編集機能の「ライブ」を求めているのか、データが入力された後に適用する機能 (上記のような) を求めているのかわかりません...私にはあまり明確ではありません。 .. 必要に応じて、より正確に入力してください ;)
もっと簡単な方法があります:
- フィルタリングを使用して、削除する行のみを表示します。たとえば、行を削除する元となる列には、A、B、C というカテゴリがありました。フィルタリング インターフェイスを使用して、削除したい A と B のみを選択しました。
- すべての行を選択して削除します。これを行うと、私の例では、すべての A 行と B 行が効果的に選択され、削除されました。スプレッドシートに行が表示されなくなりました。
- フィルターをオフにします。これにより、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 で設定された条件に基づいて行を削除できるようにするか、そうでないかを選択します。