【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。

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