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

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

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

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

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

990閲覧

GASで、スプレッドシートに入力した値と、現在の日(年・日時ではなく、「日」のみの値が合致しているかどうか) が同じであれば、チャットワークにその値を表示する というプログラムを作成しています。

tanaka_444

総合スコア19

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/08/14 08:55

編集2021/08/14 09:40

前提・実現したいこと

GASで、スプレッドシートに入力した値と、現在の日(年・日時ではなく、「日」のみの値が合致しているかどうか)
が同じであれば、チャットワークにその値を表示する
というプログラムを作成しています。

■■な機能を実装中に以下のエラーメッセージが発生しました。

#プログラム自体にエラーは出ていないのですが、スプレッドシートに「14」と入力しているけれど(本日の日と合致しているけれど)、チャットワークにelseの値(15)がに表示されてしまうため、正しく日を拾えていないかと思います。理由が分かれば教えていただきたいです。よろしくお願いします。

エラーメッセージ エラーは出ていないです。

該当のソースコード

javascript

1 2ffunction myFunction() { 3 4 5//スプレッドシートの、特定の範囲を読み込む 6var sheet = SpreadsheetApp.getActiveSheet(); 7var x = sheet.getRange(2,1).getValue(); 8 9//日付の定義(日を取得する) 10var date = new Date 11var day = date.getDate(); 12var yesterday = date.getDate(day-1); 13var tomorrow = date.getDate(day+1); 14 15//入力した日と条件が合致していれば、(CWに値を表示する) 16if( x > yesterday && x < tomorrow) 17{ 18 19x=x; 20 21} 22 23else{ 24 25x=x+1; 26 27} 28 29var client = ChatWorkClient.factory({token: '8314e1a8f4c4e0c5891d1d90f731e85b'}); 30client.sendMessage({room_id:100266334, body:x}); 31 32 33 34} 35 36

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

GASのdate.getDateメソッドは引数を取らない(指定しても無視する)ので、

GAS

1var yesterday = date.getDate(day - 1); 2var tomorrow = date.getDate(day + 1);

で得られる変数yesterdaytomorrowの値は、変数dayと同じ値です。例えば、質問日(2021-08-14)に実行すれば、すべて14になります。

すると、条件式x > yesterday && x < tomorrowは、変数xの値が何であっても(ある値より大きくかつ小さい数は存在しないことから)成立しないので、else以下の処理が常に実行されます。

次に、質問者がひねり出したyesterday < x < tomorrowという条件式は、Pythonなら質問者の想定通りに働きますが、GASではyesterday < xの評価結果(falseかtrue)を数値(0か1)に変換後、それがtomorrowの値より小さいか比較することになります。
変数xの値が何であっても評価結果はたかだか0か1なので、質問日(2021-08-14)に実行すれば全体として常に成立することになります。

「変数xの値と変数dayの値を直接等しいか比較する」のを避ける理由がなければ、変数yesterdaytomorrowも不要で、

GAS

1if (day === x) { 2 // 日が一致したときの処理 3}

とすればいいでしょう。

投稿2021/08/14 12:31

Daregada

総合スコア11990

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

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

tanaka_444

2021/08/15 06:21 編集

エラーが出ず、一応やりたいことができていたので解決したと思っていたのですが、間違ってプログラムを理解するところでした。ご回答ありがとうございます。 == GASのdate.getDateメソッドは引数を取らない(指定しても無視する)ので、 var yesterday = date.getDate(day - 1); var tomorrow = date.getDate(day + 1); で得られる変数yesterdayとtomorrowの値は、変数dayと同じ値です。例えば、質問日(2021-08-14)に実行すれば、すべて14になります。 == →こちらですが、今回は不要ですがもしyesterdayとtomorrowを出したい場合、 var date = new Date var day = date.getDate(); var yesterday = day.getDate()-1; var tomorrow = day.getDate()+1; であれば、昨日と明日の値を出すことができますでしょうか? == 次に、質問者がひねり出したyesterday < x < tomorrowという条件式は、Pythonなら質問者の想定通りに働きますが、GASではyesterday < xの評価結果(falseかtrue)を数値(0か1)に変換後、それがtomorrowの値より小さいか比較することになります。 変数xの値が何であっても評価結果はたかだか0か1なので、質問日(2021-08-14)に実行すれば全体として常に成立することになります。 == →演算子の理解誤っておりました。危うく間違えて理解するところでした。 ありがとうございます。
Daregada

2021/08/14 14:05

> var yesterday = day.getDate()-1; > var tomorrow = day.getDate()+1; > であれば、昨日と明日の値を出すことができますでしょうか? まず、変数dayの値は整数なのでgetDateメソッドは用意されていません。 dateの間違いであるとして、 「昨日と明日の値」が、変数xとの比較に使うための数値ならば「はい」。ただし、すでに得られている変数dayの値を-1、+1したほうがgetDateを毎回呼び出すよりも早いでしょう。 日付として通用する値が欲しいのであれば「いいえ」。 本日が月初(1日)のときの昨日の日付、月末(31日など)のときの明日の日付が必要なら、setDateメソッドを使ってdateを更新する必要があります。
tanaka_444

2021/08/15 06:28

== まず、変数dayの値は整数なのでgetDateメソッドは用意されていません。 dateの間違いであるとして、 「昨日と明日の値」が、変数xとの比較に使うための数値ならば「はい」。ただし、すでに得られている変数dayの値を-1、+1したほうがgetDateを毎回呼び出すよりも早いでしょう。 == →なるほど、よく理解できました。 変数xとの比較に使用したかったのですが、ご指摘の通り関数を呼び出すよりも、 変数dayの値を-1、+1にした方が早いかと思いますので参考にさせていただきます。 == 日付として通用する値が欲しいのであれば「いいえ」。 本日が月初(1日)のときの昨日の日付、月末(31日など)のときの明日の日付が必要なら、setDateメソッドを使ってdateを更新する必要があります。 == →こちらの、日付として通用する値の出し方も、知っておきたかったので勉強になりました。 ご回答ありがとうございました!
Daregada

2021/08/15 06:54

それでは、「解決した方法」を解除して、こちらを選択して下さい。
tanaka_444

2021/08/15 10:45

こちらの解決方法を選択しましたm(_ _)m
guest

0

こちら解決しました。
if文の中の条件式が誤っていたというミスでした。
yesterday<x<tomorrowにすると正しく実行されました。

投稿2021/08/14 12:00

tanaka_444

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問