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

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

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

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

Google Apps Script

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

Q&A

2回答

1326閲覧

グーグルスプレッドシート 新たな値の入力があったら その値を特定のメールアドレスにスプレッドシートを開かなくても見えるように送りたい

suzu20

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/10/25 05:26

編集2022/10/25 06:35

グーグルスプレッドシートのGASを使い シート内のA列に新しく入力があったら、特定のメールアドレスに送信するというところまではできたのですが、シート内のA列に新しく入力があった A列からG列までの値を 特定のメールアドレスに貼り付けて または テキスト文章で
送信先の相手にわかりやすくメール送信するにはどうすればいいでしょうか

※A列に入力があったら特定の相手にメールで通知するところまではできました
グーグルフォームで予約フォームをつくりたくて 毎回 相手が入力フォームでメールアドレスの収集のため メールアドレスを入力させるのを
省き 相手に質問の回答を確認のためメールで自動返信したく思っています。

function notification(){

const recipient = '〇〇〇'; //通知を飛ばす先のgメールアドレス
const subject = '新規入力あり';//通知タイトル
const body = 'ここにA列に入力があったか判定されたら、そのA列からG列までの値を表示したい';//確認するシートのURL

var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得
var myCell = mySheet.getActiveCell(); //アクティブセルを取得

if(myCell.getColumn()==1){ //A列に入力があったか判定
GmailApp.sendEmail(recipient, subject, body);//通知メールを送信
}
}

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

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

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

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

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

Cocode

2022/10/25 06:13 編集

いくつか確認させてください。 ①間違って入力してしまった場合も自動でメールが送信されてしまいます。A列に入力があったら送信するのではなく、ユーザーが「メールを送信する」ボタンを押したら送信するのはいかがでしょうか? ②一つのシートに複数のユーザーが入力するのでしょうか?それともユーザーごとに別シートでしょうか? --- 「Google Apps Script」タグの追加をお願いしますm(_ _)m --- (追記) > グーグルフォームで予約フォームをつくりたくて 毎回 相手が入力フォームでメールアドレスの収集のため メールアドレスを入力させるのを省き 相手に質問の回答を確認のためメールで自動返信したく思っています。 どう意味でしょうか? 「ユーザーがGoogleフォームで回答を送信 → スプレッドシートにその内容を自動で出力 → ユーザーの回答内容をユーザーにメール送信(送信完了メール的なの)」 または 「スプレッドシートをGoogleフォーム代わりに使用したい」
suzu20

2022/10/25 06:38

①間違って入力してしまった場合も自動でメールが送信されてしまいます。A列に入力があったら送信するのではなく、ユーザーが「メールを送信する」ボタンを押したら送信するのはいかがでしょうか? A:そうですね たしかにアドレスを間違ってはいけないので ボタンを押せば送信でいいですね ②一つのシートに複数のユーザーが入力するのでしょうか?それともユーザーごとに別シートでしょうか? A:ユーザーごとに別シートでやっていきたいです。 「ユーザーがGoogleフォームで回答を送信 → スプレッドシートにその内容を自動で出力 → ユーザーの回答内容をユーザーにメール送信(送信完了メール的なの)」 ↑その通りです。まさしくそれがしたいのです。 すいません 何分 素人なもので 答えに不手際があるかもしれませんがお許しください 返信ありがとうございました<m(__)m>
Cocode

2022/10/25 06:46

お答えありがとうございます! 送信完了メールでしたらGASを使わなくても、Googleフォームのアドオンで実装できますが、それではダメなのでしょうか? https://ferret-plus.com/40697
suzu20

2022/10/25 06:58 編集

こちらこそありがとうございます<m(__)m> Eメールの自動収集は 回答を送信してくる相手が 回答するたびにいちいちメールアドレスを毎回打ち込まないとだめでしょうし メールを送信したい相手は特定の人物なのでアドレスはもうすでに私のほうで控えてあります。なので、 Eメールの自動収集を使わずに 回答を相手にメールしたいのです。 Email Notifications for Google Formsはためして 実行することに成功しましたが このアドオン 無料で使えるのが1日20通までと制限があるので 私の環境での実用を考えると制限を超える可能性があります そういう事情があり なんとかできないかなぁと悩んでおります  
Cocode

2022/10/25 06:59

また、「ユーザーがGoogleフォームで回答を送信 → スプレッドシートにその内容を自動で出力」ですが、これによって自動でつくられるスプレッドシートはユーザー全員共通のシートになります。 ユーザーごとに別シートではありません。 (私が知らないだけで、一つのフォームで回答ごとに別シートにする方法があるのかもしれませんが><) ですので、回答者に一度スプレッドシートを確認させて、送信完了メールを送信させるということでしたら、回答者は全員分の回答内容が見えてしまいます。 そして自分の回答以外の回答をメール送信可能になってしまいます。 またはスプレッドシートから送信完了メールを送信するのは、回答者ではなく管理者でしょうか?
Cocode

2022/10/25 07:04 編集

ユーザーごとに別フォームなら、それぞれ別のスプレッドシートになりますので、ユーザーごとに別シートが実現できます! そして、ユーザーごとに別フォームにされるなら、ユーザーにわざわざスプレッドシートを確認してもらってA列に何かを入力する、または、送信ボタンを押してもらわなくても、回答があった時点で自動返信メールを送ることが可能です。 ユーザーごとに別フォームという認識で大丈夫でしょうか?
Cocode

2022/10/25 07:12

長々すみません>< 以下私の提案をまとめます。 フォームが送信されたら、ユーザーにスプレッドシートを確認させることなく、ユーザーのメールアドレスを本人に入力してもらう必要もなく、本当に自動で送信完了メールを送りたいのであれば、 ①ユーザーごとに別フォームを用意する。 ②または、回答の際に必須項目で社員番号などID番号を入力させる(IDとメールアドレスを紐づけるため) --- ユーザーにわざわざスプレッドシートを確認してもらうくらいなら、普通に返信用メールアドレスを入力させた方が、ユーザーとしても分かりやすいと思います>< そして、返信用メールアドレスを入力してもらえるのであれば、アドオンに頼らずともGASでもできるので、20通という制限もありません。
suzu20

2022/10/25 07:13

私のちとわかりづらい説明で申し訳ありません 画像を用意しましたので そちらをみてくださると わかる?かなと思います。
suzu20

2022/10/25 07:16

なるほど ようやくわかりました。 これスクリプトは一つのシートでしか作れないので 別々の人に送るってできないんですね・・・。 
Cocode

2022/10/25 07:29

一つのスプレッドシートに別シートでも、フォームが別々ならなんとか行けると思います。やってみます。
Cocode

2022/10/25 08:45 編集

いけそうです
guest

回答2

0

コードを書く前の準備

1)別々のフォームを作成する

ユーザー一人につき、その人専用のフォームを使用します。
人数分用意してください。

2)一つのスプレッドシートに、フォームの集計を出力設定

フォームの編集画面から、任意のスプレッドシートとリンクさせてください。
すべてのフォームを同じスプレッドシートに設定して大丈夫です。
一つのスプレッドシートの中に、フォーム分別々の集計用シートが生成されることになります。

3)シートIDを調べる

以下のGASを実行すると、シートIDを確認することができます。
集計用シートすべてのシートIDを確認し、メモしてください。
シートIDは10桁の数字です。

シートID確認用関数

javascript

1function fetchSheetIds() { 2 const ss = SpreadsheetApp.getActive(); 3 const sheets = ss.getSheets(); 4 5 for (const s of sheets) { 6 console.log(s.getSheetName(), s.getSheetId().toString()); 7 } 8}
出力例
6:24:36 PM Info Aさんの予約受付フォーム 1753080031 6:24:36 PM Info Bさんの予約受付フォーム 1625175797

完成コード例

  • 準備ができましたら、以下のnotification(e)関数をかきます。
    • const recipient = {...}[sheedId];の中身を書き換えてください。先ほどメモした10桁の数字と、対応する送信先のメールアドレスを入力します。
  • トリガーを設定します。
    • GASのエディタの左側の時計アイコン「Toriggers」→「+ Add Trigger」→「Choose which function to run:norification」→「Select event type:On form submit」→「Save」
    • これで、フォームが送信された際にnotification(e)関数が実行されるようになります。

javascript

1function notification(e) { 2 const sheet = SpreadsheetApp.getActiveSheet(); // シートを取得 3 const sheetId = sheet.getSheetId().toString(); // シートIDを取得して、文字列化 4 const data = e.values; // フォームで送信された内容を取得 5 6 // シートIDに対応するメールアドレスを選択 7 const recipient = { 8 '1753080031': 'Aさんのメールアドレス', // 10桁の数字はシートのID 9 '1625175797': 'Bさんのメールアドレス' // 10桁の数字はシートのID 10 }[sheetId]; 11 12 // 通知タイトル 13 const subject = '新規入力あり'; 14 15 // フォームの各項目名を取得 16 const [titles] = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); 17 18 // 1行ずつ「項目名:回答内容」の形式で本文を作成 19 const body = data.map((d, i) => `${titles[i]}: ${d}`).join('\n'); 20 21 // 通知メールを送信 22 GmailApp.sendEmail(recipient, subject, body); // 通知メールを送信 23}
  • function notification(e)の引数eで、フォームの送信情報がはいったオブジェクトを取得しています。
  • const data = e.valuesで回答内容が一時配列として取得できます。
  • それをdata.map(...)で、本文としていい感じに整形しています。

本文例)

Timestamp: 10/25/2022 18:07:59 1つめの項目名: 1つめの回答内容 2つめの項目名: 2つめの回答内容 3つめの項目名: 3つめの回答内容 4つめの項目名: 4つめの回答内容 5つめの項目名: 5つめの回答内容 6つめの項目名: 6つめの回答内容

const body = data.map(...).join('\n')が何をしているのかよく別れなければ、本文を1行ずつ手作業で書いてもいいです。
その場合以下のようになります。

javascript

1 let body = `${titles[0]}${data[0]}\n`; 2 body += `${titles[1]}${data[1]}\n`; 3 body += `${titles[2]}${data[2]}\n`; 4 body += `${titles[3]}${data[3]}\n`; 5 body += `${titles[4]}${data[4]}\n`; 6 body += `${titles[5]}${data[5]}\n`; 7 body += `${titles[6]}${data[6]}`;
  • この方法ですと、フォームの質問数が増減したときにコードも修正しなければなりませんので非効率ですが、分かりやすいかとは思います。
  • \nは改行コードです。改行させたいところに書きます。htmlの<br>みたいな感じ。

参考:フォーム送信時に実行するGASについて

Googleフォームで回答が送信されたときをトリガーにして、送信された回答内容(値)を取得してGASの関数を実行させる方法には二通りあります。

ですので、質問者様の「A列がアクティブで値が何か入力されたら実行する」という条件は、今回の「フォームが送信された時に自動返信メールを送りたい」を実装するにはあまり適切な方法ではありません。

投稿2022/10/25 09:43

編集2022/10/26 09:40
Cocode

総合スコア2314

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

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

Cocode

2022/10/25 10:02

コードを修正しました。 回答を投稿時に間違えて必要な行を消してしまっていたので、エラーがでてしまっていました。
suzu20

2022/10/26 07:59

本当にありがとうございます 助かります <m(__)m>
Cocode

2022/10/26 09:42

お役に立てましたら幸いです。 もしかしたら「フォーム送信をトリガーに、送信内容の値を取得して実行する」という手法をご存知なかったのかな。 なので「A列に値が入力されたら」という条件にされてたのかな、という予測のもと、全く違う方法で申し訳ありませんがコードを提案させていただきましたm(_ _)m
guest

0

イメージ説明

フォームは個別に一人一人フォームを用意して AさんならAさん専用フォーム BさんならBさん専用フォーム
を作っていますので 回答は個別に一つずつのシートになります。
青い枠で囲っているのが 最新のAさんが回答した答えなので この青い枠の部分を メールアドレスを収集せずに
Aさんに回答を 予約確認メールとして送信したいわけです。

投稿2022/10/25 07:10

suzu20

総合スコア0

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

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

Cocode

2022/10/25 07:14

なるほど!ユーザーごとに別フォーム了解です!詳細ありがとうございます。 ここは回答欄ですので、できればこの内容をそのまま質問を編集して追加していただければと思います! 要件が理解できましたので早速コードを書いてみたいと思います。 一人一フォームであれば、ユーザーにシートを確認させることなく、自動でメール送信可能です。 コメント欄でたくさん質問失礼しました。
suzu20

2022/10/25 08:34

すいません わかりづらくて ありがとうございます(´;ω;`)
suzu20

2022/10/25 08:36

こちらこそ 失礼しました (´;ω;`)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問