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

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

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

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

Google

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

Q&A

解決済

2回答

2600閲覧

とある日付と一致するデータのみ出力したいです「Google Apps Script」

Yt182

総合スコア4

Google スプレッドシート

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

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

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

Google

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

0グッド

0クリップ

投稿2020/07/10 02:34

前提・実現したいこと

Google Apps Scriptで栄養素管理Webアプリを作成しようとしています。
機能は以下です。
①Googleフォームから都度食べたものの品目やカロリーをスプレッドシートへ投入
②毎朝8時に「昨日の摂取カロリーは〇〇、摂取タンパク質量は〇〇g、体重は〇〇kgでした」とメールでリマインドしてくれる

発生している問題・エラーメッセージ

①は問題なくできました。
②のコードを書いていますが、うまくいきません。

1.スプレッドシート「栄養素記録(回答)」をSpreadsheetオブジェクトとして取得する。
2.そのSpreadsheetオブジェクトの配下にあるシート「フォームの回答 1」をSheetオブジェクトとして取得する。
3.そのSheetオブジェクトの配下にあるA列(タイムスタンプ)が昨日の日付のC列(摂取カロリー)のセルを取得する。
4.取得した値を合計する
5.そのSheetオブジェクトの配下にあるA列(タイムスタンプ)が昨日の日付のD列(摂取タンパク質)のセルを取得する。
6.取得した値を合計する
7.そのSheetオブジェクトの配下にあるA列(タイムスタンプ)が昨日の日付のE列(体重)のセルを取得する。
8.取得した値の最大値を取得する
9.メールで送信する

この流れでコードを書いています。

現時点では↓

function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = sheet.getLastRow(); const date = new Date(); const today = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); const day = date.getDate(); date.setDate(day-1); const yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); for(let i = 2; i<=lastRow; i++) { if(sheet.getRange(i,1).getValue()=== yesterday){ console.log(sheet.getRange(i,3).getValue()); } } }

「昨日」を取得する定数yesterdayを定義し、
for関数を用い、2行から下を順番に処理していくようにし、
if関数で「i,1(タイムスタンプ列)」が「定数yesterday」と一致する「i,3(摂取カロリー列)」を出力する。
というコードを書いたつもりですがうまくいきません。

タイムスタンプが「2020/07/10 4:01:26」のように日付のみではなく時間も含んでいるのが原因でしょうか。
この場合は部分一致で書かなければいけないのでしょうか。

どなたかご教授お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

日付の文字列同士の比較を使うバージョン

GAS

1function myFunction() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const lastRow = sheet.getLastRow(); 4 const date = new Date(); 5 const today = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); 6 const day = date.getDate(); 7 date.setDate(day - 1); 8 const yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); 9 10 for(let i = 2; i <= lastRow; i++) { 11 var rowDate = Utilities.formatDate(sheet.getRange(i, 1).getValue(), 'JST', 'yyyy/MM/dd'); 12 13 if (rowDate === yesterday){ 14 console.log(sheet.getRange(i,3).getValue()); 15 } 16 } 17}

getTime()で得られる経過ミリ秒で比較するバージョン

GAS

1function myFunction() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const lastRow = sheet.getLastRow(); 4 const date = new Date(); 5 date.setHours(0, 0, 0, 0); 6 const todayStart = date.getTime(); 7 const day = date.getDate(); 8 date.setDate(day - 1); 9 const yesterdayStart = date.getTime(); 10 11 for(let i = 2; i <= lastRow; i++) { 12 var rowTime = new Date(sheet.getRange(i, 1).getValue()).getTime(); 13 if (rowTime >= yesterdayStart && rowTime < todayStart){ 14 console.log(sheet.getRange(i, 3).getValue()); 15 } 16 } 17}

実際に大きな表を処理するなら、getValue()ではなくgetValues()を使った方がいいな。

投稿2020/07/10 04:58

編集2020/07/10 05:15
Daregada

総合スコア11990

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

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

Yt182

2020/07/10 05:48

お詳しい回答ありがとうございます。 実行してみると、Stackdriverのログが「この実行に関するログはありません」となるのですが問題ないのでしょうか? また、出力した値をすべて合計するにはどうしたらいいでしょうか。
Daregada

2020/07/10 07:30 編集

このスクリプトは、スプレッドシートに組み込むタイプで、現在のアクティブなシートのA列から日時を読み込み、C列の内容をログに書き出す、という(提示されたスクリプトが目指していた)動作を行ないます。 こちらの環境では、スプレッドシートのA列に適当な日時、C列に確認用の文字列を設定し、そのスプレッドシートに組み込まれたスクリプトを実行すると、スプレッドシートから「スクリプトエディタ」で開くエディタのログ機能や、そこからたどれるStackdriverのログに、A列が昨日の日時である行に限定してC列の内容がログに出力されていました。
Daregada

2020/07/10 07:29

「実行してみると」では、どこでどういう実行をしたかわからないので、そちらの状況はそちらで解決してください。 スプレッドシートとは独立して動作するスクリプトなら、シートを取得する部分の書き方が全く異なるので、このままでは動きません。
Yt182

2020/07/10 08:00 編集

動かしてみましたら正常に動きました。ありがとうございました。
Yt182

2020/07/10 08:00

動かしてみましたら正常に動きました。ありがとうございました。
Daregada

2020/07/10 09:03

では、昨日と判定されたif文の中に、各列ごとの合計や最大値を計算する式を組み込めばいいですね。頑張ってください。
Yt182

2020/07/10 15:38

頑張ってみます。 お忙しい中ありがとうございました。
guest

0

Google フォームで記録されるスプレッドシートのタイムスタンプ列の値を取得すると、Date型になっているはずなので、時刻部分と取り除いてから比較する等すればいいはずです。

投稿2020/07/10 03:51

draq

総合スコア2577

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

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

Yt182

2020/07/10 03:52

時刻部分を取り除くにはどうしたらよいでしょうか。
draq

2020/07/10 03:57

Utilities.formatDate 使って日付部分のみの文字列にフォーマットするとか、getFullYear()/getMonth()/getDate() 使って自分で新しい Date 作るとか、いろいろ方法あります。
Yt182

2020/07/10 04:26

すみません、初心者過ぎてわかりません。 上の僕が書いたコードのどこになにを足せばいいのか、ヒントだけでも教えていただけないでしょうか
draq

2020/07/10 04:44 編集

if(Utilities.formatDate(sheet.getRange(i,1).getValue() , 'JST', 'yyyy/MM/dd') === yesterday) { } とか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問