
食品の期限を管理するために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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptで文字列の特定文字...
-
javascriptで複数キーワード検...
-
GASでundefinedエラーが出ます
-
cgiでポーリングして取得したデ...
-
C#OpenCv V4にのエラーに関する...
-
C#で、ContextMenuStripに動的...
-
IE8で種類が一致しませんとエラ...
-
JavaScriptで平日のみをカウン...
-
JScriptでExcelの全シートにア...
-
テキスト改行(split+vbCrLf)に...
-
jqGridについて
-
VSCODE[Python]の設定について
-
ASP.NET MVCでObjectをjsに渡す
-
台形公式
-
var_dumpのdump意味はを知りた...
-
コールバック関数(?)をループし...
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
ActiveXobjectが作成できない
-
innerHTML実行後のイベント
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#で、ContextMenuStripに動的...
-
C#OpenCv V4にのエラーに関する...
-
javascriptでiframeのURL変更は?
-
ASP.NET MVCでObjectをjsに渡す
-
ASP.NETのコントロールの値をJa...
-
ローカルにあるファイルを検索...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
船のゲームを作っているのです...
-
商品コードを入力で、商品名、...
-
スクリプトのフルパス取得したい
-
HTMLにWSHを組み込む
-
Javascript 特定のフォルダのデ...
-
XMLの空白要素をJavas...
-
google feed api
-
html javascript リンク先アド...
-
JavaScriptで平日のみをカウン...
-
$("body").height();と$("body"...
-
シンプルなweb版スタンプラリー...
おすすめ情報