【GAS】SpreadSheetやっててconstconstconstconstウワーーーってなったときにこうしたら良いんじゃないかと言う【javascript】

SS上に展開したいヘッダー情報、DB上に存在するフィールド名情報、それぞれのSS上の座標情報、全部constconstconstってやってってウワーーーーってなったので、未来の自分のために知見をまとめておくから次のプロジェクトはこれに則って作るように。

まずはDBに登録するときのフィールド名を絶対基準にして定数化。

const PRICE = "price"
const TAX = "tax"
const CODE = "code"
const JAN = "jan"
const MEMO = "memo"

で、DBに入れる必要のあるフィールドだけリスト化。

let dbList = [
  PRICE,
  TAX,
  CODE,
  JAN ]  //MEMOは要らない

それとは別に、SS上に展開したいフィールドも表示したい順序でリスト化。

let ssList = [
  // 上から順に0,1,2...の座標が振られる
  PRICE,
  TAX,
  CODE,
  MEMO
] // 今回は全部にする

さらに、前回の記事のやり方等で座標情報を持たせる。

let index = setIndex(ssList) // もちろん匿名関数を使っても良い。
function setIndex(list){
  let result = {}
  for(let n = 0; n < list.length; n++){
    result[list[n]] = n
  }
  return result
}

X軸情報もY軸情報も欲しいときは・・・諦めてこうかな・・・

const ROW = "row"
const COL = "col"
// 呼び出すときのせめてもの手間削減
let coodinates = setCoodinates()
function setCoodinates(){
  let result = {}
  result[PRICE] = {"row":1,"col":1},
  result[TAX] = {"row":1,"col":2},
  ...
  return result
}
// let coodinates = {PRICE;{"row":1,"col":1}...}ってやりたいけど、それだと"price"じゃなくて"PRICE"がキーになってしまうのだった。

もうちょっと良い方法を思いつきたい。

そんで、DB登録時にデータを拾うときは、こう。

let data = {}
let sheetArr = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getValues()
for(let y; y<sheetArr.length; y++){
  for(key of Object.keys(index){
    if(dbList.includes(key) == false){continue;} // dbに入れるリストにないなら飛ばす
    data[key] = sheetArr[y][index[key]]
  }
}

これでだいぶ拾いやすいはず。

最初の定数化を億劫がらずにやること。
億劫がると最終的にあっちにもこっちにもフィールド名のべた書きが残って地獄。(今地獄。)

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