質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1272閲覧

スプレッドシートでgetValuesで取得した二次元配列の処理について

sawa

総合スコア3002

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/06/30 04:40

編集2020/06/30 14:20

スプレッドシートでgetValuesで取得した二次元配列の処理について教えてください。
なお、エラーが出る等の質問ではなく、より良い(正しい?)書き方の指南をいただきたいというお願いです。

以下のコードは 日にち毎のシートに分かれているデータを集計シートに統合する処理で、日付が古いものがシート番号の後ろのほうに来ている為、古い方から for文で データを取得しています。

集計シートの A列には 通し番号(3行目にタイトル行があり、データは4行目から)
集計シートの B列に取得したデータが入っていたシート名を 入れるようにしています。

元々はシートのデータ取得、貼付け、シート名取得、貼付け を forで回してたのですが、処理速度向上と関数での配列処理の勉強の為、 mapunshiftを使って 2次元配列の各要素の最初に シート名を追加と、そのデータを concat で結合することで、貼付け処理を最後の1回にしています。

質問としては、

  1. Data.map(function(arr){ の処理の箇所ですが、本当はアロー関数で書きたいのですが、unshiftが返り値がないため、書き方がわからず funciton を使って記述しています。こういった処理をアロー関数でより短く書くことは可能でしょうか?

  2. 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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんな感じでしょうか。

js

1function q273985() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheets = ss.getSheets(); 4 const sumSheetName = '集計'; 5 const sumSheet = ss.getSheetByName(sumSheetName); 6 7 //最初に集計シートの該当範囲をクリア 8 const lastRow = sumSheet.getLastRow(); 9 if (lastRow > 4) { 10 sumSheet.getRange(4, 2, lastRow - 3, 19).clearContent(); 11 } 12 13 const data = []; 14 15 sheets.reverse().forEach(sheet => { 16 const sheetName = sheet.getSheetName(); 17 if(sheetName !== sumSheetName) { 18 const dataRow = sheet.getLastRow(); 19 data.push(...(sheet.getRange(4, 2, dataRow - 3 , 8).getValues().map(arr => [sheetName, ...arr]))); 20 } 21 }); 22 Logger.log(data); 23 sumSheet.getRange(4,2, data.length, 9).setValues(data); 24} 25

投稿2020/06/30 07:16

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2020/06/30 08:33

全体手直しありがとうございます。 なるほど。reverse()を使うと sheetsの配列の並びが逆転するので、forEach で後ろのシートから順に処理が出来るのですね。そして1文で私のやりたかった配列処理を一気にやって pushしていくと。ご提示いただければ読解はなんとか出来るようになってきたのですが、まだまだ自分でこう書けるまでは遠そうです。勉強になりました。
guest

0

ベストアンサー

一個一個解決しちゃうと、ツギハギになってしまうような気もしますが、一応一つずつ回答しておきます。

  1. unshiftを使わずに記述します。

js

1const Data2 = Data.map(arr => [sheetName, ...arr]);

2.pushしましょう。(なんで返り値がほしいのかがわからないです。)

js

1const values = []; 2 3for(i=sheetcount-1 ; i > 0 ; i=i-1){ 4 /* 省略 */ 5 values.push(...Data2); 6}

3.これでいいなら初期化(クリア)しなきゃいいんじゃないですか?

投稿2020/06/30 06:50

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2020/06/30 07:04

macaron_XXX様 ありがとうございます。3つとも回答いただき助かります。3は確かにおっしゃる通りですね。 最初のクリアする範囲を変更することで対応しました。 1、2に関しては、私が ... の使い方を理解してない故に 質問のような記述になった次第です。 ちなみに この... は、使ってるケースを見たことはあるのですが、検索でもうまく引っかからず、読み方もよくわからない為、自分の中で消化できていません。解説されているサイト等あれば 教えていただければ幸いです。
sawa

2020/06/30 07:18

早速ありがとうございます。活用できるケースが多々ありそうなので、読み込んで色々試したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問