マクロを使うまでもなく、下記のように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」が返ります)
変更するときは「C:E」という範囲指定部分と、検索文字列の部分だけ変えればよいです。
マクロについては「どのような条件のとき、どのような値が返ってきてほしいか」という要件が全く明らかにされていないし「御自分で試されたコード」すら書かれていないため、現段階では答えようがありません。
(指定範囲のうち最初に合致したデータだけ返せばよいのか?複数返すのか?セル番地として返す必要があるのか?行数だけ返せばよいのか?複数合致するものを返したいという場合、カンマ区切りで返すのか?それともスペース区切りか?配列で返すのか?・・・などなど)
(仮に要件までこちらで推測して作っても「それは自分の希望するものじゃない」って言われれば無駄骨になってしまうので)
ヒントを言えば、カスタム関数であっても範囲指定は通常の数式と同様の形式で指定することができます。
マクロ(スクリプト)には、指定した範囲が二次元配列として渡されるので、後は二次元配列として処理するだけOKです。
たとえば下記は指定した範囲の行数と列数を返すカスタム関数(マクロ)です。
(console.logを入れているので、GASの実行ログを見ればrangeにどのような形でデータが渡されているか一目瞭然かと)
function GetRangeSize(range) {
console.log(range);
if (!range) return '';
return '行数=' + String(range.length) +', 列数=' + String(range[0].length)
}
注意:数式の指定範囲と、数式を置いたセルが重なっていると無限ループになりいつまでたっても結果が返ってきません(たとえば、A1セルに「=GetRangeSize(A1:C10)」という数式を書く等)