スプレッドシートでgetValuesで取得した二次元配列の処理について教えてください。
なお、エラーが出る等の質問ではなく、より良い(正しい?)書き方の指南をいただきたいというお願いです。
以下のコードは 日にち毎のシートに分かれているデータを集計シートに統合する処理で、日付が古いものがシート番号の後ろのほうに来ている為、古い方から for文で データを取得しています。
集計シートの A列には 通し番号(3行目にタイトル行があり、データは4行目から)
集計シートの B列に取得したデータが入っていたシート名を 入れるようにしています。
元々はシートのデータ取得、貼付け、シート名取得、貼付け を forで回してたのですが、処理速度向上と関数での配列処理の勉強の為、 map
とunshift
を使って 2次元配列の各要素の最初に シート名を追加と、そのデータを concat
で結合することで、貼付け処理を最後の1回にしています。
質問としては、
-
Data.map(function(arr){
の処理の箇所ですが、本当はアロー関数で書きたいのですが、unshift
が返り値がないため、書き方がわからず funciton を使って記述しています。こういった処理をアロー関数でより短く書くことは可能でしょうか? -
for文の最後の処理
var Array = Array.concat(Data2);
ですが、こちらは逆にpush
での追加と違って返り値が欲しい為、このような書き方となっています。理解不足ですが、const
ではうまくいかない為です。ただ、ネット上ではvar
を使うケースは殆どないという記事を見たことがあり、書き方として正しくないのでは?と気になっています。
このような for文で 配列を結合していく場合の書き方として、より良いものがあれば教えてください。
3. 最後の.setFormula("=SEQUENCE(COUNTA(B4:B))")
ですが、単に集計シートのA列に連番をふりたいというだけなのですが、上記の二次元配列の処理に組み込むよい方法があれば知りたいです。
以上、よろしくお願いいたします。
GAS
1function Sheetsummary() { 2 3 4 const SS = SpreadsheetApp.getActiveSpreadsheet(); 5 const sheets = SS.getSheets(); 6 const sheetcount = sheets.length; 7 const SumSheet = SS.getSheetByName("集計"); 8 9 //最初に集計シートの該当範囲をクリア 10 SumSheet.getRange(4,1,SumSheet.getLastRow(),20).clearContent(); 11 12 var Array =[]; 13 14 for(i=sheetcount-1 ; i > 0 ; i=i-1){ 15 const sheetName = sheets[i].getSheetName(); 16 const DataHigh = sheets[i].getLastRow()-3; 17 const Data = sheets[i].getRange(4,2,DataHigh,8).getValues(); 18 19 const Data2 = Data.map(function(arr){ 20 arr.unshift(sheetName); 21 return arr; 22 }); 23 24 var Array = Array.concat(Data2); 25 26 } 27 28 const TRow = SumSheet.getLastRow()+1; 29 SumSheet.getRange(TRow,2,Array.length,9).setValues(Array); 30 31 SumSheet.getRange(4,1).setFormula("=SEQUENCE(COUNTA(B4:B))"); 32 33}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 08:33