スプレッドシートを扱っていると、空白セルがどこにあるのか知りたいことがあります。
例えば、下の表の中に空白セルはどこに何個あるでしょうか?
データが多いほど、空白セルを見つけるのが難しくなります。
- 空白セルを1つずつ探すのが面倒
- 確認範囲が広いと見落としがち
- データが更新されるたびに空白セルを確認しないといけない
この記事では『GASを使って空白セルを自動判定する方法』についてご紹介します。
GASを使うと複数のシートを対象に空白セルの自動判定ができ、わざわざ各セルや行・列に関数を設定する手間も省けます。
また、空白セルの判定だけで終わることなく、次の処理(空白セルを含む行の削除など)を連続的に行えるのも魅力的です。
- 自動で正確に空白セルを判定したい
- 具体的なサンプルコードが知りたい
- 空白セルの判定をもとに、次の処理も連続的に行いたい
- 空白セルが含まれる行の削除方法が知りたい
isBlank( )メソッドについて
空白セルを自動判定する際に使用するのがisBlank( )メソッドです。
以下の構文のように、Rangeオブジェクトに続きisBlank( )メソッドを記載します。
構文:Rangeオブジェクト.isBlank( )
( )内の引数は不要です。
戻り値のデータ型がBooleanなので、Rangeオブジェクトで指定した範囲が全て空白であればtrue、空白でなければfalseを返すという仕組みです。
試しに下の表におけるA1:G18セルを指定して、isBlank( )メソッドで空白セルの判定をしてみましょう。(薄く水色になっている部分が空白セルです。)
サンプルコードは以下のとおりです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
const range = sheet.getRange("A1:G18"); //A1セルからG18セルを取得して変数rangeとして宣言
console.log(range.isBlank()); //指定した範囲が空白であるかを判定
}
実行結果です↓
結果はfalse、つまり”指定した範囲は空白でない”という結果を返してきています。
指定した範囲のA1:G18セルには4つの空白セルが含まれているのに、なぜでしょうか?
これは、isBlank( )メソッドが、指定された範囲が全て空白セルであるか否かを見ているからです。
逆を言えば、A1:G18セルの中にはデータの入っているセルもあり、指定した範囲全てが空白なわけではないのでfalseとなるということです。
これを検証する為に、A1:G18セルを全て空白の状態で先程のサンプルコードを実行してみようと思います↓
実行結果です↓
今度はtrue、つまり指定した範囲が全て空白セルであることを表しています。
- 空白セルの判定にはisBlank( )メソッドを使用する
- isBlank( )はRangeオブジェクトのあとに記載する
- 指定した範囲が全て空白の時にtrue、そうでない時にfalseを返す
空白セルを判定する
前述のような判定では本来意図する”セル1つ1つが空白か否か”を判定できないため、腑に落ちない部分があると思います。
ですので、次からはセル1つ1つが空白であるかを判定する方法について解説します。
あくまでセルの空白判定をするのはisBlank( )メソッドですが、これに繰り返し処理を組み合わせてセルを1つずつ空白判定する方法です。
単一の列の中で空白セルを判定したい場合
例えば以下の表のように、1つの列 (今回はB列) の中でどのセルが空白かを判定していきたいと思います。
サンプルコードです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
for(let row=1; row<=18; row++){ //1行目から18行目まで{}内の処理を繰り返す
const range = sheet.getRange(row,2,1,1); //B:1〜B:18セルを1つずつ指定
if(range.isBlank()){ //指定したセルが空白だった場合
console.log("B:"+row+"セルが空白です"); //セル番号をログに返す
}
}
}
今回はB列にあるセルを判定するだけなので、繰り返し処理 (for文) でB1セル、B2セル、B3セル・・・B18セルというように1行目から18行目を順番に見ていき、空白があれば条件分岐 (if文) でセル番号をログに返すようにしています。
実行結果です↓
確実に空白セルの番号が返されていますね。
単一の行の中で空白セルを判定したい場合
考え方は前述の単一列の中で空白セルを判定する場合と同じです。
参考に、13行目でどの列に空白セルがあるかを判定する場合の例をあげてみました。
サンプルコードです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
for(let col=1; col<=7; col++){ //A列(1列目)からG列(7列目)まで{}内の処理を繰り返す
const range = sheet.getRange(13,col,1,1); //A:13〜G:13セルを1つずつ指定
if(range.isBlank()){ //指定したセルが空白だった場合
console.log("13行"+col+"列目が空白セルです"); //セル番号をログに返す
}
}
}
実行結果です↓
複数の行列の中で空白セルを判定したい場合
下記の表のように、複数の行列 (18行×7列) の中で空白セルを判定する場合の解説です。
今回は分かり易くするために空白セルを黄色にしてみましょう。
サンプルコードです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
for(let col=1; col<=7; col++){ //A列(1列目)からG列(7列目)まで{}内の処理を繰り返す
for(let row=1; row<=18; row++){ //1行目から18行目まで{}内の処理を繰り返す
const range = sheet.getRange(row,col,1,1); //row行col列を1つずつ指定
if(range.isBlank()){ //指定したセルが空白だった場合
range.setBackground("yellow"); //セルを黄色にする
}
}
}
}
実行結果です↓
- セルを1つずつ空白判定する場合、繰り返し処理 (for文) を使う
- isBlank( )メソッドの戻り値 (true または false) を利用して条件分岐 (if文) を使う
空白セルがある行を削除する
既にお分かりかもしれませんが、isBlank( )の戻り値であるtrueまたはfalseをもとに条件分岐すれば、様々な処理が可能です。
今度は空白セルのある行を削除してみましょう。
行を削除する場合、以下の2パターンに分けることができますので、必要に応じてご参照ください。
全ての列が空白セルの場合
まずは全ての列が空白セルの場合に行ごと削除する方法です。
下の表の4行目、10行目、16行目は全ての列においてセルが空白なので、これらの行を削除します。
サンプルコードです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
let row_number = sheet.getLastRow(); //データがある最終行を取得(この時点では最終行=18行目)
for(let row=1; row<=row_number; row++){ //1行目から最終行まで{}内の処理を繰り返す
const range = sheet.getRange(row,1,1,7); //row行のA列〜G列を指定
if(range.isBlank()){ //指定した行のセルが全て空白だった場合
sheet.deleteRow(row); //行を削除
row = row-1; //1行削除した分、row行を1行繰り上げ
row_number = row_number-1; //1行削除した分、最終行も1行繰り上がる
}
}
}
実行結果です↓
一部の列に空白セルが含まれている場合
今度は列に1つでも空白セルが含まれている場合に行ごと削除する方法です。
下の表には18行中5つの行に空白セルが含まれています。
これらの行を削除したら、最終的に残るのは13行になるはずです。
サンプルコードです↓
function myFunction(){
const sheet = SpreadsheetApp.getActiveSheet(); //アクティブなシートを取得して変数sheetとして宣言
let row_number = sheet.getLastRow(); //データがある最終行を取得(この時点では最終行=18行目)
for(let col=1; col<=7; col++){ //A列(1列目)からG列(7列目)まで{}内の処理を繰り返す
for(let row=1; row<=row_number; row++){ //1行目から最終行まで{}内の処理を繰り返す
const range = sheet.getRange(row,col,1,1); //row行col列を1つずつ指定
if(range.isBlank()){ //指定したセルが空白だった場合
sheet.deleteRow(row); //行を削除
row = row-1; //1行削除した分、row行を1行繰り上げ
row_number = row_number-1; //1行削除した分、最終行も1行繰り上がる
}
}
}
}
実行結果です↓
まとめ
この記事では『GASを使って空白セルを自動判定する方法』についてご紹介しました。
- 空白セルの判定にはisBlank( )メソッドを使用する
- isBlank( )はRangeオブジェクトのあとに記載する
- 指定した範囲が全て空白の時にtrue、そうでない時にfalseを返す
- セルを1つずつ空白判定する場合、繰り返し処理 (for文) を使う
- isBlank( )メソッドの戻り値 (true または false) を利用して条件分岐 (if文) を使う
isBlank( )メソッドで空白判定を行い、必要に応じて繰り返し処理や戻り値を利用した条件分岐を行いましょう。
コメント