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)さんがご自身のブログで記事を書かれていました。

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

2019年1月の人気記事前のページ

指定したスライドにユーザー設定レイアウトを適用するPowerPointマクロ次のページ

関連記事

  1. Office関連

    Google スライドで新規プレゼンテーションを作成するVBAマクロ

    ここ数日PowerPointのマクロに加え、Google Apps S…

  2. Google関連

    Gmail APIを使ってメール送信するC#コード

    「たまには.NET用のライブラリを使ってGoogle APIでも触って…

  3. Office関連

    Google TTSで文字列を読み上げるマクロ

    2012/02/09 追記:関連記事・Google翻訳…

  4. Microsoft Graph

    [Google Apps Script]Office 365 unified APIを使ってメールを…

    久しぶりのGoogle Apps Scriptネタです。今回はGo…

  5. Excel

    Gmail APIを使ってメール送信するVBAマクロ(3)

    前回、前々回とGmail APIを扱ってきましたが、今回は前々回の記事…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP