【GAS】スプレッドシートの見出し行の値をプログラムから入れたり、その値に1から順番を振ってコードを見やすくしたりなんだりする【javascript】
【やりたいこと】
見出し行に入力するヘッダーと、「どの値がどの行に入っているか」の情報を有機的に変更したいんじゃ。
【今回の結論】
//データ処理シートのヘッダー並び順・ここに並んでいる順に、0から列数が振られる
let labels =[
"name",
"tel",
"age",
];
function setCoordinates(labels){
let coordinates = {};
for(let n = 0; n <labels.length ; n++){
coordinates[labels[n]] = n
};
return coordinates;
}
// 使う時は
let cols = setCoordinates()
let name = vals[1][cols["name"]];
let tel = vals[1][cols["tel"]];
let age = vals[1][cols["age"]];
...
【つまりどういうことか】
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let vals = sheet.getDataRange().getValues(); //シート上の値を配列に突っ込む
let name = vals[1][0]; // nameは1列目の2行目にある
let tel = vals[1][1]; // telは2列目の2行目にある
let age = vals[1][2]; // ageは3列目の2行目にある
...
みたいな感じで、シートの中のデータを取得しているときに、突然他から、「やっぱり、二列目には住所が欲しいんだけど」とか言われる可能性があるときや、システムの仕様変更がありうるとき。
まあ、もちろんのことべた書きしないで
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let vals = sheet.getDataRange().getValues(); //シート上の値を配列に突っ込む
let name = vals[1][NAME_COL]; // nameは1列目の2行目にある
let tel = vals[1][TEL_COL]; // telは2列目の2行目にある
let age = vals[1][AGE_COL]; // ageは3列目の2行目にある
...
ってしておくのが基本なんですけども、そうすっと
const NAME_COL = 1;
const TEL_COL = 2;
const AGE_COL = 3;
...
って無限に並べておかなきゃいけなくて美しくないし、1から単純に番号振るだけのコードって虚無だし、「やっぱり2行目に住所ほしいや」って言われたときにTEL以降の行を全部書き換えです。上の例なら3行ですが、これが20行とか100行とかになってきたらどうしましょう。
VSCodeの機能やスプレッドシート使えば時短は出来るかも知れないけど、書き換え作業がどう足掻いても虚無です。
んで、思いついたのがこちらの方法。
//データ処理シートのヘッダー並び順・ここに並んでいる順に、0から列数が振られる
let labels =[
"name",
"tel",
"age",
];
function setCoordinates(labels){
let coordinates = {};
for(let n = 0; n <labels.length ; n++){
coordinates[labels[n]] = n
};
return coordinates;
}
// 使う時は
let cols = setCoordinates()
let name = vals[1][cols["name"]];
let tel = vals[1][cols["tel"]];
let age = vals[1][cols["age"]];
...
※Rowの方はあんま使う機会がないので深く考えてないです。
とまあ、こんな具合に
1・ヘッダーに入れるラベルを配列で用意(並べる順に)
2・配列を引数にとるsetCoordinates関数を用意
3・ラベル配列をforで地道に回して、{ラベル:順番,ラベル:順番,ラベル:順番,...}になるオブジェクトを作る
という手順を使うと、リスト内のラベルの順序を入れ替えるだけでコード全体の座標情報が書き換わります。やったね。
この記事が気に入ったらサポートをしてみませんか?