guijiu
@guijiu (taka kuwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GAS スプレッドシートの検索の際使うMATCH関数の範囲の指定の仕方

解決したいこと

GAS1年生です。(javascriptも1年生です。)

マクロでMATCH関数を使って、スプレッドシートのどこかにある文字列の位置を探し出したいと思います。

MATCH関数の構文は、

//構文
=MATCH(検索キー, 範囲, 検索の種類)

// 例
=MATCH("あいう", B:B, 0)

ですが、
この範囲の指定の仕方について質問します。
範囲の指定の仕方は、同一行または同一列でなければなりません。
例えば、B:BとしていしたらB列しか検索できず、C列の検索はできません。

マクロを使って、B列以外も検索したいのですが、何か良い範囲の指定方法はないでしょうか?
例えば、範囲を変数にする方法等はないでしょうか?具体的な書き方を教えてください。

自分で試そうとしてること

MATCH関数が使えなければ、セルをひとつひとつ動かして、セルに書かれた文字列を検索するしかないのかな??

0

2Answer

Comments

  1. @guijiu

    Questioner

    なかなか、いい感じです。
    コードを読み込んでみます。
    ありがとうございました。

マクロを使うまでもなく、下記のようにBYCOLとLAMBDAを使えば可能です。

下記は、指定した範囲の各列それぞれ何行目に、指定した値があるかをカンマ区切りで返す数式です。

たとえば、C2セルとD3セルに「あいう」という文字列を入力し、
A1セルに下記の数式を入力してください。

=TEXTJOIN(",",,BYCOL(C:E,LAMBDA(x,IFERROR(MATCH("あいう",x,0),0))))

この数式の場合C~Eの範囲から「あいう」という文字列を探し、その行位置をカンマ区切りで返します。合致する文字列がない位置は「0」を返します

(図の状態だと、C列の2行目、D列の3行目が合致し、E列には合致する値がないので「2,3,0」が返ります)

image.png

変更するときは「C:E」という範囲指定部分と、検索文字列の部分だけ変えればよいです。


マクロについては「どのような条件のとき、どのような値が返ってきてほしいか」という要件が全く明らかにされていないし「御自分で試されたコード」すら書かれていないため、現段階では答えようがありません。

(指定範囲のうち最初に合致したデータだけ返せばよいのか?複数返すのか?セル番地として返す必要があるのか?行数だけ返せばよいのか?複数合致するものを返したいという場合、カンマ区切りで返すのか?それともスペース区切りか?配列で返すのか?・・・などなど)

(仮に要件までこちらで推測して作っても「それは自分の希望するものじゃない」って言われれば無駄骨になってしまうので)

ヒントを言えば、カスタム関数であっても範囲指定は通常の数式と同様の形式で指定することができます。
マクロ(スクリプト)には、指定した範囲が二次元配列として渡されるので、後は二次元配列として処理するだけOKです。

たとえば下記は指定した範囲の行数と列数を返すカスタム関数(マクロ)です。

(console.logを入れているので、GASの実行ログを見ればrangeにどのような形でデータが渡されているか一目瞭然かと)

function GetRangeSize(range) {
  console.log(range);
  if (!range) return '';
  return '行数=' + String(range.length) +', 列数=' + String(range[0].length)
}

image.png

注意:数式の指定範囲と、数式を置いたセルが重なっていると無限ループになりいつまでたっても結果が返ってきません(たとえば、A1セルに「=GetRangeSize(A1:C10)」という数式を書く等)

0Like

Comments

  1. @guijiu

    Questioner

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

    GASにもラムダ関数があるのですね。(JAVAとかC#とかで勉強したことがありますが、使えるレベルには達していません。)
    すっきりしていていいと思います。
    コードを読み解きたいと思います。

Your answer might help someone💌