【GAS】全部の行に数式を入れたい。あるいはjavascriptでreplaceAllのはなし。
【やりたいこと】
データベースから複数行に渡る情報を持ってきて、スプレッドシート上に展開しつつ、その行に計算式も入れて計算結果を表示したい。(単価と個数はDBから取ってきて、合計金額だけスプレッドシートで計算したい)
【結論】
let data = [
["りんご",10,100],
["みかん",5,80],
["なし",20,200],
]
let fx = "= Bn * Cn"
let tempArr = []
for(let row = 1 ; row > data.length ; row++){
let line = data[row]
let tempRow = []
for(let val of line){
tempRow.push(val)
}
tempRow.push(fx.replace(/n/g,row))
}
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
sheet.getRange(1,1,tempArr.length,tempArr[0].length).setValues(tempArr)
【つまり】
1・dataのような二次元配列をDBとかから持ってくる。
2・A列に「りんご」「みかん」、B列に個数、C列に単価が入るとするので、D列に入れたい式は「=B1*C1」。
3・行数の部分は行毎に変わるので、とりあえずnと置いて、数式のテンプレートだけ変数に入れておく。
4・受け取ったデータを二次元配列にフォーマットする
(上のサンプルだと「何無駄な回し直ししてんだよ」って感じになるけど、実際DBから取ってきた情報はJSONとかだったりするので、必要に応じてごにょごにょする)
5・その時、行数をカウントする変数を作っておく
6・数式を入れたいところで、数式を入れた変数に対してreplaceを使う。
7・普通のreplaceだと、先頭のnしか置換されないので、全部置換するために正規表現を使う。「/」でターゲット文字を囲んで、さらに「g」を付与すると全部が置換される。
8・あとは貼り付けたい範囲をgetRangeして、二次元配列をsetValueすればOK。
この記事が気に入ったらサポートをしてみませんか?