
食品の期限を管理するためにGASを利用しようとコードを参考にしたのですがうまく動作してくれないためお力をお貸し頂ければたらと思い投稿しました。
↓以下↓
function mailSend() {
var mySs = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得
var Sheet = mySs.getSheetByName('食材管理'); // シート名を取得
var today = new Date(); //今日の日付を取得
var strTo = "〇〇@gmail.com"; //To
var strSender = "××"; //差出人名
var strFrom = "△△@gmail.com"; //From
/* 繰り返し計算 */
for (var i = 2; i <= 200; i++) {
var to_do = Sheet.getRange(i, 3).getValue(); //B列 何を買った?を取得
var status = Sheet.getRange(i, 4).getValue(); //C列「個数」を取得
var limit = Sheet.getRange(i, 5).getValue(); //D列「期限」を取得
var date_limit = new Date(limit); //G列「期限」のDateを作成
var dt = date_limit.getTime() - today.getTime(); //date_limitから今日の日付を引く
var day = Math.ceil(dt / 1000 / 60 / 60 / 24);
//日付に変換
}
if (status == "完了") /* ステータスが完了なら何もしない */;
else if (5 <= day && day <= 7) { //締め切りの7日~5日前
/* メール本文を準備 */
var strSubject1 = to_do + "の期限まで" + day + "日です";
var strBody1 = to_do + "の消費に取り掛かりましょう。\n" /* 改行 */
+ "期限まであと" + day + "日です。\n" /* 改行 */
+ "\n" /* 改行 */
+"期限:" + date_limit;
/* メールを送信 */
var send = GmailApp.sendEmail(
strTo,
strSubject1,
strBody1, {
from: strFrom,
name: strSender
}
);
}
else if (1 <= day && day <= 4) { //締め切りの1~4日前
/* メール本文を準備 */
var strSubject2 = to_do + "の期限まであと" + day + "日です!";
var strBody2 = to_do + "の消費は順調ですか?\n" /* 改行 */
+ "期限まであと" + day + "日です。\n" /* 改行 */
+ "\n" /* 改行 */
+"期限:" + date_limit;
/* メールを送信 */
var send = GmailApp.sendEmail(
strTo,
strSubject2,
strBody2, {
from: strFrom,
name: strSender
}
);
}
else if (day <= 0) { //締め切り日
/* メール本文を準備 */
var strSubject3 = to_do + "の締切日を過ぎています。";
var strBody3 = to_do + "は締切日を過ぎています。廃棄は完了しましたか?\n" /* 改行 */
+"期限:" + date_limit;
/* メールを送信 */
var send = GmailApp.sendEmail(
strTo,
strSubject3,
strBody3, {
from: strFrom,
name: strSender
}
);
}
}
以上になります。よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> var to_do = ... //B列 何を買った?を取得
何も買っていない場合の判定が必要です。
> var status = ... //C列「個数」を取得
> if (status == "完了")
個数が "完了" とは何でしょうか?
このあたりの画面設計から見直すべきでしょう。
> for (var i = 2; i <= 200; i++) {
for 文で 199 行分の繰り返しをしていますが、
期限判定とメール送信処理は 1 行分の 1 回しか行っていません。
以下のいずれかへ設計を見直しましょう
* 1 行分のメールを 199 回送信
* 199 行分のメール本文を編集して 1 回送信 ← おすすめ
* 199 行から告知すべき 1 行分を探して 1 回送信
No.2
- 回答日時:
No1です。
スプレッドシートは使っていないのですけれど・・
例えば、添付図のような表があるとして、本日(=8/12)より7日後以前に期限がくるものを抽出したいとします。
図ではG2セルに
=SORT(FILTER(C2:E20,E2:E20<today()+8,E2:E20<>""),3,1)
の式を入力してあります。
この結果、G2セル以降に、該当する行が期限の早い順に並べて抽出されます。
質問者様がお求めの内容に近い結果になってはいないでしょうか?
※ 単純な関数計算なので、C:E列の入力を増減すれば自動反映されますし、閲覧日(=today())に応じて自動更新もされます。
ご参考までに。

No.1
- 回答日時:
こんにちは
スプレッドシートもGASもほとんど知らないでの回答ですので、以下はあくまでもご参考までに・・・
>うまく動作してくれません
この表現だけだと、あまりにも漠としていて「何が上手く行かないのか」わかりません。
以下を、順にチェックしてみてください。
◇ 実行のトリガー
ご提示は関数定義のみですが、関数を設定してもどうやって実行しているのかが不明です。
自動実行の設定をしているのか、手動で実行しているのか・・
いずれにしろ、定義をするだけでは実行されることはありません。
まずは、実行できているのかをご確認ください。
(その際に、エラーが出るかどうかも。エラーが出ていれば、そのメッセージ内容が重要なヒントになります。)
◇ 計算部分
>SpreadsheetApp.getActiveSpreadsheet()
でシートを取得していますが、手動でスクリプトを実行するという事でしょうか?
自動実行でご提示の処理だけを実行するような場合には、getActiveSpreadsheet()は機能しないであろうと推測します。
シートの仕様を存じませんが、特に日付に関しては表示値と実際の値が異なっている可能性があります。
>getValue()
で取得した値がどのようになっているかを確認なさってみてください。
またその値を
>new Date(取得値)
で、正しく日付オブジェクトに変換できているのかも確認してみてください。
※ シートの日付欄が空欄(や日付以外の値)である可能性はありませんか?
空欄の場合でも正しく計算できるのかのチェックが必要と思います。
万一、日付以外の値があっても、エラーにならない制御も必要と思います。
※ 処理対象を数件にして、計算部分だけを実行し、結果をセルに出力するなり
alert表示などさせてみれば、計算部分のチェックは可能だと思います。
◇ メール送信部分
こちらの仕様も存じませんけれど、ドキュメントを見ると、オプションのfrom等には制限があるようです。
https://developers.google.com/apps-script/refere …
正しい指定になっているかをご確認ください。
※ オプション指定なしで試してみて送信できるのなら、そのあたりが怪しいということになるでしょう。
◇ 全体として
ご提示の処理が実行できたとして、毎回該当行数分のメールが送信されてくることになりそうですが、煩雑ではないのでしょうか?
また、シートの日付が空欄の場合のチェックも行ってはいないようですが、空欄分が全て送信されるてしまうようなことはありませんか?
雰囲気として、シートを開いたうえでスクリプトを実行するというお考えのように推測しますが、シートを開くのであれば、スクリプトを使わずとも関数等を設定しておくことで同様の計算は簡単にできるはずです。
更に、条件付き書式などを利用することで、色付け等の強調表示により視認しやすくもできると思います。
数が多くて一覧しにくいと言うのであれば、別シート(同一シートでも可)に該当するものだけを抽出して表示するような仕組みにしておけば、更に視認性は上がると思いますけれど・・・
(なぜスクリプトを使うのかがよくわかりません)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- JavaScript メールフォームの日付入力フォームで過去の日付で範囲指定する方法が分かりません 3 2024/04/05 17:43
- JavaScript GASでGoogleフォームの自動返信システムを作成しようとしたけれど保存ができません。 2 2023/12/26 18:19
- JavaScript HTMLで作った時報アプリが動きません 1 2024/01/21 09:49
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript javaScriptのコードの修正をお願いします。 1 2024/05/16 12:38
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
プログラマーは誘惑にさらされる人生?
その他(プログラミング・Web制作)
-
近年誕生したプログラミング言語
その他(プログラミング・Web制作)
-
至急助けてください!!!あと2時間しかないです! ボタンを押したら0ランプが点灯し、コンマ5秒後に1
その他(プログラミング・Web制作)
-
-
4
次の日本語の意味を教えて下さい
C言語・C++・C#
-
5
プログラミング 学習
JavaScript
-
6
文系のSE志望です。プログラミングを今から習得したいのですが、初めて学ぶのにオススメの言語があれば教
その他(プログラミング・Web制作)
-
7
Pythonのコードエラーについてです。
その他(プログラミング・Web制作)
-
8
これて逆じゃないですか?
C言語・C++・C#
-
9
マイクロソフトがvbを捨てたのは何故ですか C#は変数の型指定ひとつとっても最近の主流とはかけ離れて
その他(プログラミング・Web制作)
-
10
excelをhtmlに変換した途端、一部フォントが変わるのはなぜでしょうか。
HTML・CSS
-
11
サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい
Visual Basic(VBA)
-
12
エディターで以下のような色になるエディターは解りますか?
その他(プログラミング・Web制作)
-
13
今ってプログラミング言語は何が中心?
C言語・C++・C#
-
14
ホログラムを作ってくれる会社はありませんか
その他(プログラミング・Web制作)
-
15
プログラマーに向いている人の特徴や性格は何がありますか?
その他(プログラミング・Web制作)
-
16
HLMT、CSSについて相談です。 私は今までずっと自身のサイトで以下のような総称ファミリーを使って
その他(プログラミング・Web制作)
-
17
2つほどお聞きしたいことがあり、答えてもらえると助かります。 1つ目は、チャットGPTにあらかじめ、
C言語・C++・C#
-
18
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
19
swift言語の最適化 swift最適化を最大限に出来たらcc++よりもだいぶ早く実行出来ますか?s
C言語・C++・C#
-
20
パソコン
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で、ContextMenuStripに動的...
-
ASP.NET MVCでObjectをjsに渡す
-
google apps scriptの終了のさせ方
-
ASP.NETのコントロールの値をJa...
-
JavaScriptで文字列の特定文字...
-
pdfに丸秘などのスタンプを...
-
cgiでポーリングして取得したデ...
-
毎週土曜日のみの日付を取得、...
-
jQueryのload()を使用して外部...
-
JavaScriptで年月日表示のカウ...
-
C#OpenCv V4にのエラーに関する...
-
イベントが初めの一回しか起き...
-
jacascriptでサイトにRSSフィー...
-
JavaScriptの配列データの取り...
-
GASでGoogleフォームの自動返信...
-
ジェネレーターの作り方
-
JavaScriptで決まった「時刻」...
-
イラレでナンバリングする方法
-
functionから別のfunctionを実...
-
excle VBA とweb上の検索を利用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#で、ContextMenuStripに動的...
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
ASP.NET MVCでObjectをjsに渡す
-
翌月を取得するGASが分かりません
-
gas スプレッドシートがアクテ...
-
ASP.NETのコントロールの値をJa...
-
シンプルなweb版スタンプラリー...
-
ローカルにあるファイルを検索...
-
なぜmatchメソッドがエラーにな...
-
jqGridについて
-
APIを使って埋め込んだグーグル...
-
イラレでナンバリングする方法
-
JavaScriptで文字列の特定文字...
-
【javascript】正規表現で括弧...
-
VSCODE[Python]の設定について
-
JAVASCRIPTで万年カレンダーを...
-
毎日日付の変わるタイミングを...
おすすめ情報