【GAS】map関数を使って、一列分のデータだけを華麗に取得する

やりたいこと

スプレッドシート上にあれこれ展開した情報のうち、1列だけ、例えば計算結果のC列だけ、ごっそり配列として取得したいんじゃよ、っていうときに、forだのなんだのごにょごにょ書くのめーんどーくさーい。

結論

const CODE_COL = 0 // 取得したい列番号
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let vals = sheet.getDataRange().getValues();
// シートの値を二次元配列化(ここまで準備)

function getCodeList(vals){
	let codeList = vals.map((line) => line[CODE_COL])
	return codeList
}

華麗じゃないやり方

const CODE_COL = 0
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let vals = sheet.getDataRange().getValues();
// ここまで準備

function getCodeList(vals){
	let codeList = []
	for(let line of vals){
		let code = line[CODE_COL]
		codeList.push(code)
	}
	return codeList
}

空配列codeListを作って、一行ずつ拾ってpushしていく。

A列とB列とD列はそのまま拾って、C列は拾ったあと加工して配列に入れて、E列飛ばして、F列に入っている数字に対応した文字列を取得してそっちを配列に入れて……みたいなけったいなことをやるなら、forで回す方が良いこともあるけれど、だって取りたいの一行だけだよ? もっとシンプルに書けないものかね??

書けました。

華麗なやり方のせつめい

// 準備は省略
function getCodeList(vals){
	let codeList = vals.map((line) => line[CODE_COL]) //ココが華麗
	return codeList
}

forで回す代わりに、map関数を使います。

アロー関数(=>)を使ったmapの使い方はこちらに詳しくまとめてありますが、ざっくり言うと

●map()は、「引数を一つ以上取る関数」を引数に取る
→匿名関数を使い map(function(line){return line[CODE_COL]})
●アロー(=>)を使うと「function」を省ける
→ map((line) => {return line[CODE_COL]})
●ところで、{}の中が一行なら、{}もreturnも省ける
→map((line) => line[CODE_COL])

さらに本当は引数が一つなら、引数を囲む()も省略出来ちゃうんですが、あとで自分が読み返したときに「この突然出てきた変数lineは何だ……?」ってなるので、今のところ()だけ残して記述するようにしています。慣れたら消すでしょう。

ちなみになんなら

// 準備は省略
function getCodeList(vals){
	return vals.map((line) => line[CODE_COL])
}

って書けば本当に一行で取れる!!華麗!!

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