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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1067閲覧

javascriptの繰り返しの処理がうまくいかない

sakana_motoki

総合スコア16

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2020/06/25 18:50

編集2020/06/25 18:50

はじめまして
イメージ説明
上記の表から退会通知日=今日の日付になったらメッセージにアカウント名とグループ名を取得し通知を送信する仕組みをgasとline messaging apiで作っております。
しかし繰り返し処理がうまく書けずに悩んでおります。

問題点1 上から三つまでしかチェックされていない
問題点2 07/23の日付もまるがついてしまっている

javascript

1function checkAcount(){ 2//年月日を取得 3var today = new Date(); 4today.setHours(0, 0, 0, 0); 5// 利用しているシート 6var data = SpreadsheetApp.openById('xxxxxxx').getSheetByName('シート1'); 7//最終行を取得 8var last_row = data.getLastRow(); 9//退会の行のみ取得 10var cansellRow=data.getRange(2,4,last_row-1,1).getValues(); 11 for(var i = 2; i < cansellRow.length; i++) { 12 var cansellrow =new Date(cansellRow[i]); 13 console.log(cansellrow.getTime()); 14 if(cansellrow.getTime() ==today.getTime() ){ 15 var accountName = data.getRange(i,2).getValue(); 16 var groupName = data.getRange(i,1).getValue(); 17 data.getRange(i,5).setValue("◎"); 18 }else{ 19 data.getRange(i, 5).setValue("×"); 20 } 21 } 22 }

問題点1はどのような解決方法があるのでしょうか?

問題点2
console.log(cansellrow.getTime());
この結果
D 2020-06-25T18:46:17.012Z 1593097200000
D 2020-06-25T18:46:17.224Z 1593097200000
D 2020-06-25T18:46:17.740Z 1593097200000
が返ってきました。
多分日付の比較の仕方がまずいのかなと思います。
このあと退会通知日の5日前にはスプレッドシートの該当部分の色をかえるという処理を加えるのでわかりやすいような日付比較を教えていただけますと幸いですよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ええと、cansellRowは、提示されている表だと5行分得られますね。

2行目から比較していくので、2行目から5行分、つまり7行目より小さい間forループを回さないといけません。提示されたコードだと、2行目から5行目より小さい間ループしているので、4行目までしか処理されないのです。

そして、cansellRowの要素を取り出すときには、行番号が入っているiをそのまま使うのではなく、cansellRowの先頭(添え字0)から取り出せるように、i - 2としなければなりません。そのままiを使っているので、cansellRow[2]~cansellRow[4]だけが使われ、これらはすべて「◎」の範囲の日付なのです。

JavaScript

1for(var i = 2; i < cansellRow.length + 2; i++) { 2 var cansellrow =new Date(cansellRow[i - 2]);

本当は、iを行番号ではなく0からcansellRowのlength分ループさせて、getRangeのほうを調整したほうがわかりやすそうですが、修正箇所が多くなってしまうので。

追伸: キャンセルの綴りはcancelです。

投稿2020/06/25 23:05

編集2020/06/25 23:15
Daregada

総合スコア11990

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

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

sakana_motoki

2020/06/26 04:13

ありがとうございます!行けました! このあと通知を送った行の背景色を赤くしようと思って以下の文を追加したのですが var ss =SpreadsheetApp.getActiveSheet(); ss.getRange(i,1,1,4).setBackgrounds(bgc_red); Exception: パラメータ(String)が SpreadsheetApp.Range.setBackgrounds のメソッドのシグネチャと一致しません。 at checkAcount(コード:81:30) というエラーが起きているのですが原因わかりますでしょうか? そのままvar dataでもエラーが起きていました
Daregada

2020/06/26 04:21

それはそれで質問を立ててください。有料サポートじゃあないので。
sakana_motoki

2020/06/26 05:33

そうですねありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問