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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

解決済

2回答

889閲覧

【GAS】スプレッドシートに新規に登録されたB列C列の内容だけを複数の人にメールで通知したい

chinana

総合スコア7

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/04/14 08:21

編集2020/04/14 09:20

前提・実現したいこと

フォームから入力された内容をスプレッドシートに反映して
新規に登録されたB列C列の内容だけを複数の人にメールで通知したい。

【スプレッドシート】

     A    B    C    D    ……
1  時間  名前   性別   希望
2      
3

フォームが入力されると列の2、3…と新しいものが続いていくので
フォームから送信された最新の情報(一番下の行)のうちBとCだけ即時にメールに載せて送りたい。

該当のソースコード

function wmapp_contact_me_mail_send() {

var sheet = SpreadsheetApp.getActiveSheet();
var ALastRow = sheet.getLastRow(); Logger.log(ALastRow);//10行
var range = sheet.getRange('B:C');
var values = range.getValues();
var mail_to = 'xxxx@gmail.com';
var subject = "新着"
var body="確認 \n\n";
body +=" 内容 \n\n";
var i=0; i<values.length; i ++
body += values[i][0] + ":" + values[i][1] + "\n";

MailApp.sendEmail(mail_to, subject,body);
range.setValues(values);
}

現状

見様見真似でここまで作ったのですが、これだとB,Cの2列目だけがメールに載る状態です。
トリガーはスプレッドシートに「フォーム送信時」としてあります。
どうしたら最新の内容だけを拾う事ができるのでしょうか?

どうかお力を貸していただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

CHERRY

2020/04/14 08:58

> 新規に登録されたB列C列の内容だけを複数の人にメールで通知したい。 > どうしたら最新の内容だけを拾う事ができるのでしょうか? まず、「新規に登録された行」を判断する基準が必要です。 たとえば、1日に1回、1日分をまとめて送信するのであれば、前回送信後の24時間以内に登録されたデータ行を抽出します。 「新規に登録された」と判断するタイミングや条件は何でしょうか?
chinana

2020/04/14 09:26 編集

CHERRY様 ご指摘ありがとうございます。 「新規に登録された」はフォームからデータが送られてきた(スプレッドシートの一番下の行が増えた)タイミングに即時メールを送りたいと思っております。 実現したいことと現状に追記をいたしました。 不足がありましたら再度ご指摘いただけましたら幸いです。 よろしくお願いいたします。
guest

回答2

0

ベストアンサー

普通こうやるよねの方

javascript

1const q253590 = (e) => { 2 const to = "your_gmail@gmail.com"; 3 const subject = "新着"; 4 const body = `確認 5 6内容 7 8${e.values[1]}:${e.values[2]} 9`; 10 MailApp.sendEmail(to,subject,body); 11}

添削にも共通するのですが、teratail ではある時期、シート側のフォーム送信時で、ラグがある(回答送信からシートでの反映までタイムラグがある)、複数回実行される、複数回実行時にデータの一部欠損が起きる、が報告されてきていました。
最近質問が減っているのでもしかしたらまた挙動かわったのかもしれませんが、基本的にフォームのスクリプトでフォーム送信時トリガーを作ったほうが安全です。
特に今回のものはシートで集計などを行っていない(フォームの回答内にメールに送りたい値が必ず含まれる)のでなおさらです。

投稿2020/04/14 13:16

papinianus

総合スコア12705

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

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

chinana

2020/04/14 14:25

papinianus様 添削のみならず、美しく書き直してくださったものまでありがとうございます。 何が足らなかったのか、また、いかに迂遠に書いていたのか大変よくわかりました。 ひとまずこちらをスプレッドシートに反映させました。 フォームのスクリプトのほうが安全との事でしたので、別途チャレンジしてみたいと思います。 数日頭を悩ませていたので、教えていただけて助かりました。 本当にありがとうございます。
guest

0

添削

javascript

1function wmapp_contact_me_mail_send() { 2 3 var sheet = SpreadsheetApp.getActiveSheet(); 4 var ALastRow = sheet.getLastRow()-1; Logger.log(ALastRow);//10行 5 var range = sheet.getRange('B:C'); 6 var values = range.getValues(); 7 var mail_to = 'xxxx@gmail.com'; 8 var subject = "新着" 9 var body="確認 \n\n"; 10 body +=" 内容 \n\n"; 11 //var i=0; i<values.length; i ++ 12 body += values[ALastRow][0] + ":" + values[ALastRow][1] + "\n"; 13 14 MailApp.sendEmail(mail_to, subject,body); 15 range.setValues(values); 16}

投稿2020/04/14 13:12

編集2020/04/14 13:16
papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問