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

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

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

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

JavaScript

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

Q&A

2回答

2554閲覧

GAS: ループ制御が終わらない

jesuissuyaa

総合スコア18

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2019/07/17 00:05

Google Apps Scriptで、日付が昇順に並んでいる列があり、日付ごとにカウントしたいです。
例:

列1列2
7/15 20:00data
7/15 21:00data
7/16 8:00data

→ 7/15は2件, 7/16は1件

以下のコードを実装したのですが、中のwhileループの条件がおかしいようで、関数の実行が止まりません。
どこがおかしいのかわからないので教えていただきたいです。

javascript

1function createChart() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var numRows = sheet.getLastRow(); 4 var range = sheet.getRange("D1:E3"); 5 6 var r = 2; // row cursor 7 while (r <= numRows) { 8 var date = sheet.getRange(r, 1).getValue(); 9 var dateLim = new Date(date.getTime()); 10 dateLim.setDate(date.getDate() + 1); 11 dateLim.setHours(0,0,0,0); 12 var count = 0; 13 Logger.log(date); 14 Logger.log(dateLim); 15 16 while (date < dateLim) { 17 r++; 18 date = sheet.getRange(r, 1).getValue(); 19 Logger.log(date); 20 Logger.log(dateLim); 21 Logger.log(date < dateLim); 22 } 23 24 r++; 25 } 26}

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

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

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

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

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

guest

回答2

0

dateLimが明日の午前0時で、スキャンしているdateがデータレコードなので、データに未来のデータがなければ内側のwhileが停止しないのではないかと考えました。

質問コードでr<=9で停止性があるとすると10行目より下にデータがあり(numrowsが10より大きい)、かつA列がnumrowsの値より手前の行で空白になっているように思います。

とりあえずnumrowsの値を見て見たら良いのでは?

次のステップとしてwhileとかforとかではなくreduceで実装すれば無限ループは避けられます

投稿2019/07/17 09:29

papinianus

総合スコア12705

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

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

0

Date型どうしの比較は日付の大小ではできません。

~~
while (date.getTime() < dateLim.getTime()) {
}
~~

としてください。

謹んでお詫びします。

追記

たぶん行数が多くて遅延しているだけ(200行で全然返ってこなかったです)なので、下記のコードで実現してください。

GAS

1function createChart() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var data = sheet.getDataRange().getValues(); 4 5 var r = 1; // row cursor 6 while (r < data.length) { 7 var date = data[r][0]; 8 var dateLim = new Date(date.getTime()); 9 dateLim.setDate(date.getDate() + 1); 10 dateLim.setHours(0,0,0,0); 11 var count = 0; 12 Logger.log(date); 13 Logger.log(dateLim); 14 15 while (date < dateLim) { 16 r++; 17 if(data[r]) break; 18 date = data[r][0]; 19 Logger.log(date); 20 Logger.log(dateLim); 21 Logger.log(date < dateLim); 22 } 23 24 r++; 25 } 26}

投稿2019/07/17 00:11

編集2019/07/17 01:04
macaron_xxx

総合スコア3191

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

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

jesuissuyaa

2019/07/17 00:12

Logger.logの比較ではtrue, falseが出力されたのですが、条件式では比較ができないということでしょうか?
maisumakun

2019/07/17 00:16

いちおう、不等号で比較しても.getTime()をかけたもの同士の比較と同じように扱われる(ToNumberで変換される)ので、動くことは動きます。
jesuissuyaa

2019/07/17 00:21

ありがとうございます。投稿にあるコードを走らせようとすると、いつまでも"Preparing for Execution..."となるのは、ループ制御以外のところに原因があるということでしょうか? 自分でも確認してみたのですが、条件式を r <= 9 で設定すると正常に動作するので、質問する次第です。
macaron_xxx

2019/07/17 00:22

だとするとnumRowsの値を確認すべきですね。
jesuissuyaa

2019/07/17 00:44

外側のループは終了することを確認しているので、問題ないはずです
macaron_xxx

2019/07/17 00:53

ちょっと意味がわからないのですが、外側のループの終了は確認済みで、内側のループもtrue,falseが確認できてるなら、終わらないはずないです。 ループが正常なら、何行あるのか不明ですが、ループの中でgetRange,getValuesしているから遅延しているだけでは?
macaron_xxx

2019/07/17 00:58

再現しましたが、普通に終わりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問