前提・実現したいこと
gasでスプレッドシート内の表データを加工して貼り付けたい。
画像1のような請求書作成のためのデータを格納した表があり、
これらをgasで整理し、同じ顧客への請求をまとめたいと思います。
例えば画像1内の顧客名「いいい」は3行目「訪問料」と4行目「顧問料」が存在していますので
画像2の3行目のように顧問料列、訪問料列にそれぞれ入力しようとしています。
しかし、同じ顧客であれば全て1行にするのではなく事業所Aと事業所Bの請求は別の請求書を発行する
必要があるため、加工する際も分ける必要があります。
(→画像2でいう顧客名「あああ」のような感じです。)
このように事業所ごとに請求をまとめて別のスプレッドシートへ出力したいと考えています。
発生している問題
スプレッドシートで大量のデータを扱う場合、配列というものを使ったほうがよいとのことですが
配列の加工方法を探してみても「配列内のデータを削除」や「配列に値をを加える」といった
ものばかりで、なかなか自分の探しているものがみつかりません。
配列内で加工をしようとしているからダメなわけで
配列を2つ用意して、配列1に加工前のデータを格納して配列2に加工したものをfor文で
入れていけばいいのかな?なども考えていますが、何分最近触り始めたばかりですので
これが良い処理方法なのか悪い処理方法なのかも判断ができないのです。
皆様はどのように処理を行うのでしょうか?
ご教授いただければ幸いです。
現状できているところまでのソースコードもはりますので
「こんな処理は避けたほうがいい」というものがありましたら
お願いいたします
gas
1var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 2var sheet = spreadsheet.getActiveSheet(); 3var date = new Date(); 4var testsheet = spreadsheet.getSheetByName("test"); 5 6 7function NarrowDown_CheckList() { 8 9 var lastRow = sheet.getRange(2, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //getRange([行番号], [列番号]) 10 var lastCol = sheet.getRange(2, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); 11 var month = date.getMonth() + 1; //今月を取得 12 var firstRow = 3; //項目行を無視(データが格納されている最初の行を指定) 13 14 15 16 const dataRange = sheet.getRange(firstRow, 1, lastRow, lastCol); 17 const values = dataRange.getValues(); 18 19const result = values.filter(rowData => rowData[month+6] == "1"); //今月請求する項目のみを抽出([month+6]が当月の列) 20var Vertical = result.length; //配列タテ 21var side = result[0].length; //配列ヨコ 22 23 24 25 26 27testsheet.getRange(2,1,Vertical,side).setValues(result) //テスト出力用 28}