chikako65
@chikako65

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASで空白のセルかどうかを判別して、IF文で処理を分けたい

解決したいこと

Google AppScriptのIF文での分岐を「取得したセルが空白でない場合」は処理を実行、「取得したセルが空白の場合」は処理をスキップして繰り返したいです。
この「セルが空白」というのが上手く取得できません。
「セルが空白」と判定する(値が入っていないと判定する)をおこないたいです。

発生している問題

画像の②の表のB17:B20の範囲の値を取得して、別シートにフィルターをかける処理をしたいと思っています。
(全体のコードは下のほうにある「大元の使いたいコード」です。)

※画像の表について
画像の①の表はIMPORTRANGEを使用していて、自動で変わるようになっています(B4:D11)。
画像の②の表は下記の数式を入れて苗字からフルネームに変換させています。
=IFERROR(INDEX($F$4:$G$11,MATCH(B4,$F$4:$F$11,0),2),"")

test2.png

B17:B20のセルを上から順番に取得していき、セルに氏名が入っていたらフィルターをかける処理を実行、氏名が入っていなければ処理をスキップするために、B17:B20のセルが空白かどうかを判定したいのですが、下記のコードだとすべて値が入っていると判定されてしまいます。
console.log()ではB17が [ [ '' ] ] と取得できているのですが、これは空白のセルではないということなのでしょうか。
(数式が入っているから空白ではない?)

IF文でなくてもいいので、B17:B20の範囲の値の有無で処理をわける方法を教えてください。
よろしくお願いします。

空白かどうかを判定するコード

function myFunctiontest() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_find = ss.getSheetByName('シート名');  

 for(let i = 1; i < 5 ;i++ ) { 
    var find_name = sheet_find.getRange(i+16,2).getValues();
    console.log(find_name);

    if(find_name !== '') {
      console.log(i) ;
    }
  }
}
console.log
[20-09-17 16:00:48:086 JST] [ [ '' ] ]
[20-09-17 16:00:48:089 JST] 1
[20-09-17 16:00:48:097 JST] [ [ 'A・A様' ] ]
[20-09-17 16:00:48:100 JST] 2
[20-09-17 16:00:48:108 JST] [ [ 'B・A様' ] ]
[20-09-17 16:00:48:111 JST] 3
[20-09-17 16:00:48:119 JST] [ [ 'C・A様' ] ]
[20-09-17 16:00:48:121 JST] 4

大元の使いたいコード

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_to = ss.getSheetByName('シート1'); //ペーストする自分のスプレッドシートのシート名 
  var sheet_from = ss.getSheetByName('シート2'); //フィルターをかけたいシート名 
  var sheet_find = ss.getSheetByName('シート3'); //名簿があるスプレッドシートのシート名(画像のシート) 

  for(let i = 1; i < 5 ;i++ ) { 
    var find_name = sheet_find.getRange(i+16,2).getValues();
    console.log(find_name);  

  if( find_nameに値があるなら ){

      var filter = sheet_from.getFilter();
      if( filter == null ){
      } else {
        sheet_from.getFilter().remove();//フィルタをオフにする
      }

      //フィルターで表示にする項目'find_name'を表示するフィルター基準作成
      var criteria = SpreadsheetApp.newFilterCriteria().whenTextContains(find_name).build(); 

      //特定範囲にフィルターを設定
      var filterSet = sheet_from.getRange(2, 1, sheet_from.getLastRow()-1, 9).createFilter(); 

      //フィルターをかける列 1列目の値選択
      var columnIndex = 1;  

      //フィルターをかける
      filterSet.setColumnFilterCriteria(columnIndex, criteria);

      //コピー元のシートから値の入っている全範囲をコピー
      var values = sheet_from.getDataRange().getValues().filter(function(_, i) {return i > 1 && !sheet_from.isRowHiddenByFilter(i + 1)})

      //メール本文GAS管理の3列目の最終行を求める
      var lastRow = sheet_to.getRange(sheet_to.getMaxRows(), 3).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();

      //シート1の最終行の次の行に取得したデータを張り付ける
      if (values.length > 0) {
        sheet_to.getRange(lastRow + 1 , 3, values.length, values[0].length).setValues(values);

   } else {
        ; // 何もしない
    }
  }
}
0

1Answer

もし勘違いしてたらすみません。
コード読ませてもらって1点だけ。

find_nameを取得する8行目のコードですが、
セル単体の値を取得するのはgetValue()じゃなかったかなと。

var find_name = sheet_find.getRange(i+16,2).getValues();

var find_name = sheet_find.getRange(i+16,2).getValue();

こんな感じで。
そうすると(多分)find_nameが配列でなく、セルの文字列のみで取得できて
以降のコードが働くと思います。

1Like

Comments

  1. @chikako65

    Questioner

    harmless_3d6様

    回答いただきありがとうございました。

    教えていただいた getValues(); を getValue(); に変更したところ、すべて上手くいきました。
    基本的なところが理解できていませんでした。
    本当にありがとうございます!

Your answer might help someone💌