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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

解決済

2回答

1357閲覧

GASがうまく実行されない。

rerererererejp

総合スコア0

Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

1クリップ

投稿2020/11/23 07:44

前提・実現したいこと

GASで、スプレッドシートに記載のメアドにメールを送るコードを作っています。

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

function mail_test()
function gmail()
の2つのfunctionがあるのですが、mail_testとgmailそれぞれ単独でしか実行されないようです。
mail_testで、メールを送るメアドをスプレッドシートから抽出して、gmailで送信、としたいのですが・・・。

mail_testはうまく実行されているようですが、gmailを実行すると、addressが取得できていないためか、
Exception: メールを送信できませんでした: 受信者が指定されていません(行 46、ファイル「コード」)
というメッセージが表示されます。
mail_testで抽出したメアドがgmailにうまく渡せていないと考えているのですが。

一時、なぜか思い通りに動作したのですが、またうまくいかなくなってしまいました。
GASは取り組み始めたばかりで、基本的なことがわかっていないのですが・・・、すいません。

該当のソースコード

GASです。

function mail_test() {

//シートの情報
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName('シート1');
var addr = ss.getSheetByName('アドレス管理');
const EValues = sheet1.getRange('E:E').getValues(); 
const lastRow = EValues.filter(String).length; 

//件名と本文を取得
const body0 = 'Aから社内連絡です。\n'
const body1 = 'さんから';
const body2 = 'が';
const body3 = 'で届きましたのでご確認をお願いします。';
const options = 'さんに郵便物が届きました【A社内通知】';

//アドレスをループ
for(let i = 1; i <= lastRow; i++) {

//未送付の案内だけ抽出する(K列が空欄なら送付する。送付済は、K列に「済」と入力されている)
var blank = sheet1.getRange(i, 11);
if(blank.isBlank()){

//タイトル(日付と通知案内) //var title = sheet1.getRange(i, 2).getValue() + blank + sheet1.getRange(i, 5).getValue() + options; var title = sheet1.getRange(i, 5).getValue() + options; //本文 var body = body0 + sheet1.getRange(i, 3).getValue() + body1 + sheet1.getRange(i, 7).getValue() + body2 + sheet1.getRange(i, 8).getValue() + body3; //アドレス var address = sheet1.getRange(i, 6).getValue(); //「済」と入力 var done = '済' sheet1.getRange(i, 11).setValue(done); //メール送信 gmail(address, title, body);

}
}
}

function gmail(address, title, body) {

GmailApp.sendEmail(address, title, body);

}

### 試したこと 実行で、mail_test、gmail、どちらかを選択することになっていますが、 mail_test → gmail と続けて実行したいと思っているのですが、その方法がわからないです。 また、上述の通り、一時、うまく続けて実行できていたのですが、何でうまくいっていたのか、 そして、何でまたうまくいかなくなったのかがわかりません。 ### 補足情報(FW/ツールのバージョンなど) よろしくお願いいたします。 、

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

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

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

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

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

sawa

2020/11/24 01:04

var addr = ss.getSheetByName('アドレス管理'); の方はコードの中で使われてないですが、シート1とアドレス管理のシートは 何がちがうのですか?
rerererererejp

2020/11/24 01:07

アドレス管理は、参考にしたコードを最初に移した時に作ったもので、結局不要となりました。 不要なので放っておいたものです。 ご放念ください。
sawa

2020/11/24 01:27

なるほど。メールアドレスはシート1のF列でよいのですね。 承知しました。
rerererererejp

2020/11/24 05:49

すいません。解決しました。 最終行を取得する際に、参考にしていたE列のセルがいくつか空白になっていて、それで最終行がかなり低い数字となっていて、if文でヒットしないようになっていました。 なんで空白になっていたのかは不明です。 悩みましたが良い経験となりました。 また、ご回答いただいた方、この質問を読んでくださった方に、改めて深く御礼申し上げます。
sawa

2020/11/24 06:14

解決されたようでなにより。 質問を解決済みとしてクローズされることをお勧めします。
rerererererejp

2020/11/24 06:17

ありがとうございます。 対応いたしました。 大変、勉強になりました。
guest

回答2

0

実行で、mail_test、gmail、どちらかを選択することになっていますが、

mail_test → gmail と続けて実行したいと思っているのですが、その方法がわからないです。

スクリプトエディタの「実行」メニューのことですよね。あなたの書いたコードでは、「mail_testの中でgmailを呼び出す(実行する)」という処理が書いてあるので、メニューからmail_testを実行すれば、自動的にgmailも実行されます。gmailをメニューから実行する必要はありません。

いっぽう、gmailだけをメニューから実行しようとすると、引数のaddressなどを指定していないため、当然のことながらエラーが発生します。それが、「Exception: メールを送信できませんでした(以下略)」というエラーです。

gmailの中身を見ると、GmailApp.sendEmail(address, title, body);を実行しているだけですね。これなら、わざわざ関数(gmail)を作らなくても、mail_testの中でgmailを呼び出している部分を、そのままGmailApp.sendEmail(address, title, body);で置き換えればいいのでは。

そうすれば、スプレッドシートに属するスクリプトの関数がひとつだけになるので、「実行」メニューからtest_mailを選択するのと同じ事が、スクリプトエディタの▶ボタンでも行なえます。

投稿2020/11/23 11:57

Daregada

総合スコア11990

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

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

rerererererejp

2020/11/24 00:34

ご回答、ありがとうございました。 一段落目については、メールは送信されていません(送信済みのフォルダに変化はなく、指定のアドレスにもメールは届いていない)。 二段落目については、私もそのように理解しておりました。 三段落目については、アドバイスいただいた通りやってみましたが、やはりメールは送信されていませんでした。 具体的な変更は下記のとおりです(いらない部分をコメントアウトしました)。 //メール送信 // gmail(address, title, body); GmailApp.sendEmail(address, title, body); } } } //function gmail(address, title, body) { //GmailApp.sendEmail(address, title, body); //} 「mail_testの中でgmailを呼び出す(実行する)」という処理、とのことですが、そのつなぎがうまくいっていないのでしょうか。 一時、うまくいっていたので、元のスプレッドシートには問題ないと思ってるのですが・・・。 初心者の質問で申し訳ありませんが、アドバイスいただけますと幸いです。 よろしくお願い致します。
Daregada

2020/11/24 04:22

メールが送られていない原因は、mail_testの中でgmailを呼び出す処理にあるのではなくて、それ以前の部分にあります。 つまり、スプレッドシートのシート1からデータを取ってくる部分ですね。スプレッドシートの内容を公開されていないので、これ以上のことは言えません。 EValues の内容をログに出力する、アドレスをループしている部分で、メールを送る処理をコメントにしておいて、address, title, bodyの内容をログに出力する、などを試してください。あなたの想定していない内容がそれら(特にaddress)に設定されていると思います。
rerererererejp

2020/11/24 06:16

ありがとうございます。 自己解決したのですが、まさにご指摘の点でした。
guest

0

自己解決

最終行を取得する際に、参考にしていたE列のセルがいくつか空白になっていて、それで最終行がかなり低い数字となっていて、if文でヒットしないようになっていました。

投稿2020/11/24 06:16

rerererererejp

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問