見出し画像

【GAS】VLOOKUPみたいなことをfindを使って華麗にやる

VLOOKUPがそのままGAS上でも使えれば何も問題ないんですが

結論

function lookup(target_code){
  // A列に商品名、B列に商品コードが入っているものとする
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const vals = sheet.getDataRange().getValues();  // シートの値を二次元配列化しておく

  // B列をcode、A列をdataという名前で取得し、オブジェクトのリストを作る
  const code_data_list = vals.map((line) => ({"code": line[1] , "data": line[0]}))

  // Find関数を使って、codeがtargetと一致するオブジェクトを取得する 
  const result_object = code_data_list.find( (code_data) => code_data["code"] === target_code )
  
  // result_objectのdata部分を返却する
  return result_object["data"]
}

やりたいこと

スプレッドシート上に次のような表を用意しておいて

引数に「A」が渡されたら「りんご」を取り出す、「B」なら「みかん」を取り出す…というだけの、VLOOKUPすれば何の問題もない単純な処理を作ります。
いろいろな都合で今回はGASでやりたいんだ…!

A列とB列を華麗に取得する

map関数を使った華麗な取得の仕方はこちらを参考に

しつつ、今回はB列とA列の情報を値として持つオブジェクトのリストとして取得したいのでこんな感じに

const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const vals = sheet.getDataRange().getValues();  // シートの値を二次元配列化しておく

const code_data_list = vals.map((line) => ({"code": line[1] , "data": line[0]}))
// A列は二次元配列にしたときのインデックスは0、B列は1
// =>の後の()、普段は要らないんだけど、今回は => の直後に{}が来てしまうため、()で囲んでおかないと構文エラーになる

これでA列とB列に入っている値のをオブジェクト化したもののリストが華麗に取得できました。
うまくいけばこんな情報が取れているはず

code_data_list = [
{"code": A , "data": りんご},
{"code": B , "data": みかん},
{"code": C , "data": いちご},
{"code": D , "data": さくらんぼ},
]

Findを使って、華麗にcodeで検索してdataを探し当てる

FilterはMapと同じように、「引数を1つ取る関数」を引数にとり、配列の中身に対して一つ一つその関数を実行してくれます。
Mapと違うのは、引数として渡す関数がテスト関数(わかりやすく言うと、if文のカッコの中に突っ込むやつ)である必要があることと、戻り値がリストではなく、テスト関数に一致する最初の要素であることです。

const target = "A"
const result = code_data_list.find( (code_data) => code_data["code"] === target )

これで、「code_data_listの要素を一個ずつ取り出して「codeという項目の値がtargetと一致するかどうか」を評価しろ。一致した一番最初の要素を返せ」という命令になります。華麗!

で、引数でtargetを受け取って処理できるように整理したのが冒頭の結論になります。おしまい。

この記事が気に入ったらサポートをしてみませんか?