【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で地道に回して、{ラベル:順番,ラベル:順番,ラベル:順番,...}になるオブジェクトを作る

という手順を使うと、リスト内のラベルの順序を入れ替えるだけでコード全体の座標情報が書き換わります。やったね。

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