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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

JavaScript

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

Q&A

解決済

2回答

445閲覧

2次元配列もしくは、jsonに加工するには?

rena_168

総合スコア72

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2022/06/21 11:09

以下のようなデータがあります。

日付開始時間終了時間
18:0011:00
11:0012:00
13:0017:00
27:0010:00
10:0011:00
11:0013:00
13:0018:00

これを加工して、2次元配列かjsonに格納したいのですが、どうしたらよろしいでしょうか?

日付開始時間終了時間
18:0017:00
27:0018:00

私が書いたプログラムは以下のようになります。
どうもうまくできないので、教えていただけますでしょうか。

var arrayList = {}; //連想配列宣言 for (var i = 1; i <= data.length; i++) { if (i = 1) { var starttime = Utilities.formatDate(data[i][3], 'JST', 'HH:mm'); // 開始時間 arrayList['day'] = data[i][0]; arrayList['starttime'] = starttime; continue; } else if (i > 1){ var endtime = Utilities.formatDate(data[i-1][2], 'JST', 'HH:mm'); arrayList['endtime'] = endtime; var starttime = Utilities.formatDate(data[i][1], 'JST', 'HH:mm'); // 開始時間 var nextIndex = data1.flat().findIndex(element => element == data[i][0]); arrayList['day'] = data[i][0]; arrayList['starttime'] = starttime; } } arrayList['endtime'] = data[data.length-1][2];

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

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

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

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

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

kei344

2022/06/21 13:31

「data」の定義部分も提示しましょう。
guest

回答2

0

Javascript

1const result = data[0].concat(data.slice(1).filter(v => v[0]).map(array => { 2 let lastIndex = data.findIndex(elem => elem[0] === Number(array[0]) + 1); 3 lastIndex === -1?data.length:lastIndex; 4 const endTime = data[lastIndex-1][2]; 5 return [ array[0] , array[1] , endTime ]; 6}))

投稿2022/06/22 00:39

編集2022/06/23 00:41
ouoyoueee

総合スコア43

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

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

ouoyoueee

2022/06/22 01:04 編集

また、毎回日付をフォーマットするのはめんどくさいため、 const data = sheet.getDataRange().getDisplayValues()とするのが良いです。
rena_168

2022/06/22 07:01

勉強になりました。getValuesしか使ってなかったので、この関数は便利ですね!
rena_168

2022/06/22 07:30

すみません、returnの上にログ出力を3つ書いてみた結果、以下の結果になっています。 結果がちょっと合っていないようです。 --- array[0] = 2 array[1] = Sat Dec 30 1899 07:00:00 GMT+0900 (Japan Standard Time) array[2] = Sat Dec 30 1899 17:00:00 GMT+0900 (Japan Standard Time)
ouoyoueee

2022/06/23 00:42

すみません、lastIndexの検索値を間違えていました。 ただいま修正しました。
rena_168

2022/06/23 03:15

修正ありがとうございます。 三項演算子で‐1だったらdata.lengthの値でendTimeに代入するはずですが、エラーがおきています。 書き方が初心者っぽいですが、私以下のように書いたら問題なく動きました。 --- const result = data[0].concat(data.slice(1).filter(v => v[0]).map(array => { let lastIndex = data.findIndex(elem => elem[0] === Number(array[0]) + 1); lastIndex === -1?data.length:lastIndex; var endTime = ""; if (lastIndex === -1) { Logger.log("aaa = " + lastIndex); lastIndex = data.length; } endTime = Utilities.formatDate(data[lastIndex-1][2],"JST","HH:mm"); return [ array[0] , Utilities.formatDate(array[1],"JST","HH:mm") , endTime ]; })) 何でこの三項演算子がダメなのかが不思議ですね。
ouoyoueee

2022/06/23 08:45

正しくは、lastIndex = lastIndex === lastIndex === -1?data.length:lastIndex;でしたね。 また、エラーが出ているならその内容も合わせて提示していただけると助かります。
guest

0

ベストアンサー

指定がなかったのでV8ランタイム前提ですが、私なら以下のように書きます。
dataが明示されていなかったので、スプレッドシートに質問文のように書き込み、Sheet.getDataRange().getValues()したときに得られる2次元配列として答えました。

js

1const result=[] 2 data.forEach(([dayIndex,startTime,endTime],i)=>{ 3 if(i===data.length-1){ 4 result[result.length-1][2]=Utilities.formatDate(endTime,"JST","HH:mm") 5 return 6 } 7 if(dayIndex==="")return 8 if(dayIndex>=2){ 9 result[result.length-1][2]=Utilities.formatDate(data[i-1][2],"JST","HH:mm") 10 } 11 result.push([dayIndex,Utilities.formatDate(startTime,"JST","HH:mm")]) 12 }) 13 Logger.log(result) 14//[[1.0, 08:00, 17:00], [2.0, 07:00, 18:00]]

投稿2022/06/21 15:42

編集2022/06/21 15:51
arashiyama

総合スコア33

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

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

rena_168

2022/06/22 08:01

ちゃんと出力できていい感じですが、もし開始時間の左に余分の2列があった場合は、 私以下のように2列の変数を追加し、それなりのIndex番号も変更しましたが、実行エラーになります。 私やっぱりこの書き方が理解していないからですかね? data.forEach(([dayIndex,startTime,endTime],i)=>{ ↓ data.forEach(([dayIndex,koumoku1,koumoku2,startTime,endTime],i)=>{
arashiyama

2022/06/22 08:20

·今dataがどのような構造になっているのか ·実行エラー文 を明示して頂けると助かります この書き方は分割代入と呼ばれるので良かったら調べてみてください。(そこに問題は無さそうですが)
rena_168

2022/06/22 08:57

すみません、data[0]=[1,"項目名1","項目名2",08:00,09:00]の感じです。 私spliceを2回書いて項目名1と項目名2の列を削除してやりました。 もし、削除せずもとデータのままでしたら、どう書いたほうがいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問