Google関連

[Google Apps Script]スプレッドシートのセル範囲に指定した値が含まれているかを判定する

先日、もり(@moripro3)さんから、「スプレッドシートの二次元配列の要素をGASでカッコよく検索できないか?」というツイートがありました。

二次元配列の検索となると、findIndex関数か?とも思ったのですが、今のGASでは使えません。

仕方が無いので、Array.prototype.concat.applyを使って一次元配列にしてからindexOfを使う方法を考えてみました。

function myFunction() {
  var cells = SpreadsheetApp.getActiveSheet().getRange(2, 2, 3, 3);
  var result = Array.prototype.concat.apply([],cells.getValues()).indexOf("なにぬねの");
  if (result >= 0) {
    SpreadsheetApp.getUi().alert("指定した値のセルが見つかりました。");
  } else {
    SpreadsheetApp.getUi().alert("指定した値のセルが見つかりませんでした。");
  }
}

無理やり感はありますが、大分シンプルです。
ただ、個人的にはヒットしたセルをオブジェクトとして使えるようにしたいところですので、下記のようなコードも書いてみました。

function myFunction2() {
  var cells = SpreadsheetApp.getActiveSheet().getRange(2, 2, 3, 3);
  var cell = getMatchRange(cells, "わをん");
  if(cell === void 0){
    SpreadsheetApp.getUi().alert("指定した値のセルが見つかりませんでした。");
  } else {
    cell.activate();
  }
}

//指定した値にマッチする最初のセルを返す
function getMatchRange(cells, str) {
  var reg = new RegExp("^" + str + "$"); //必要に応じて条件は変更
  for (var col = 1; col <= cells.getNumColumns(); col++) {
    for (var row = 1; row <= cells.getNumRows(); row++) {
      var cell = cells.getCell(row, col);
      if (cell.getValue().match(reg)) {
        return cell;
      }
    }
  }
}

セル範囲を1つずつ調べていき、ヒットしたらRangeを返すという、非常に泥臭い処理ですが、ヒットしたセルに対して何らかの処理を行いたい場合には使えるコードだと思います。

これで一先ず目的は達することが出来ましたが、もっとスマートな方法はないものか・・・!?🤔


2019/2/1 追記:
もり(@moripro3)さんがご自身のブログで記事を書かれていました。

同じ目的でも書き方は色々あって面白いですね!

関連記事

  1. Google関連

    [Google Apps Script]郵便番号から住所を取得する自作関数と住所から地図画像のURL…

    郵便番号検索APIを使って郵便番号から住所を取得する自作関数と、Sta…

  2. Google関連

    【オトカドール】あそべるお店マップ「オトカマップ」を作ったよ。

    当ブログで何度も取り上げているオトカ&#9829;ドールですが、公式サ…

  3. Excel

    Google翻訳で文字列を翻訳するマクロ

    ※ 2016/2 時点では下記の方法はもう使用できなくなっています。V…

  4. Google関連

    [Google Apps Script]選択中のスライドに対してのみ処理を行う

    以前、Google スライドですべてのスライドに対して処理を行う方法に…

  5. Google関連

    Google Docs用アドオンを作成する。

    「Google Docs用アドオンストアがオープン、表計算や文書作成に…

  6. Google関連

    [Google Apps Script]メニューの追加と確認ダイアログの表示

    Google Apps Scriptで新規メニューを追加し、メニューか…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP