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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1709閲覧

スクリプト メール送信

naoysd___

総合スコア12

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/02/21 08:59

編集2019/03/01 06:07

前提・実現したいこと

スプレッドシートのW~AD列に「○」が入ったら、「○」が入った列の人にメールを送信する
スクリプトを作成したいです。
またメールの内容には下記のスプレッドシートの製番等を入れたいと思っています。
初心者の為教えていただけると大変助かります。

スプレッドシートは下にどんどん内容が追加されていきますので
最終行は特定できないものになります。

papinianus様
「○」を入れたらそれぞれメールを送るようにしたいので、
図でいえば、Bさんに○が入ったら送信。Dさんに入ったら送信という風にしたいです。
なのですでに○がある場合は送らないようにしたいと考えています。

図・及び試したコードを追記致しました。
不備が多く申し訳ありません。

イメージ説明

よろしくお願い致します。

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

同じスプレッドシートで下記のようなスクリプトを作成していましたので(人に助けてもらいながら)
これアレンジしてできると思ったのですが知識が足りずできませんでした。

function myFunction() {
var ss =SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを取得
var sh =ss.getSheetByName("管理表 のコピー");
var rowSheet=sh.getDataRange().getLastRow();//使用している範囲の最終行を取得
try{
var myCell = sh.getActiveCell(); //アクティブセルを取得
}catch(e){
}
if (typeof myCell === undefined ) {
}
else{
if(myCell.getColumn() != 20){//変更セルがS列以外なら処理終了
return;
}
//○○の部分は完了とかのステータスが入る列番号
if ( sh.getRange('T' + myCell.getRow()).getValue() !== "完"){
return;
}

var Name = sh.getRange(myCell.getRow(),19).getValue();//名前 var To = {"■■":■■@gmail.com" };//アドレス var seiban = sh.getRange(myCell.getRow(),6).getValue();//製番 var Order = sh.getRange(myCell.getRow(),7).getValue();//注文主 var Sitename = sh.getRange(myCell.getRow(),8).getValue();//納入先 var Cc = "○○@gmail.com"; var person = sh.getRange('S' + myCell.getRow()).getValue();//「完」が入った行の営業担当 var Subject=+seiban+" "+Order;//メールタイトル var Body=Name+"様\n" +"\n" +"・"+seiban+"  "+Sitename+"\n" +"\n" +"よろしくお願い致します。\n" +"\n";//メール本文 if (person in To == true){ MailApp.sendEmail(To[person],Subject, Body,{cc:Cc,from:"△△@gmail.com",name:"△△"}); }

}
}

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

papinianus

2019/02/21 09:25

いつ送るのですか?例えば、図ではX列のBさんが○になっているのですが、○をつけるやいなや(Z列のDさんやAA列のEさんを待たずに)toがBさんで送るのですか? それとも、例えばボタンを押したときとか夜の10時とかに一斉に送るのでしょうか(この場合、昨日や前回送った人にも、○がついている限り再度送っていいのかという問題も想定できます)? もっと運用や仕様を質問に詳しく追記していただけないでしょうか?
scsi

2019/02/21 10:25

その前にメールサーバの用意出来てますかね
guest

回答3

0

まずは1行だけ、丸が入ったところにメールを送るスクリプトを作成しましょう
それができれば、あとは繰り返しだけとなります

投稿2019/02/21 09:14

y_waiwai

総合スコア87774

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

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

0

ベストアンサー

ゼロベースで書くのと、全部添削ではやることが違うので、回答を分けます。

/**/スタイルでコメントを書いたところを添削しました。

javascript

1function myFunction() { 2 var ss =SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを取得 3 var sh =ss.getSheetByName("管理表 のコピー"); 4 var rowSheet=sh.getDataRange().getLastRow();//使用している範囲の最終行を取得 5 try{ 6 var myCell = sh.getActiveCell(); //アクティブセルを取得 7 }catch(e){ 8 /* catchしたらリターンしないと、myCellは取れてないので。 */ 9 return; 10 } 11 if (typeof myCell === undefined ) { 12 /* myCellがないときもリターンしたほうがいい。ただし編集時トリガにすればここにくることはない。変更時トリガだと起こり得る */ 13 /* 良く考えたらcatchと同じことじゃね??必要なのだろうか? */ 14 return; 15 } 16 //if(myCell.getColumn() != 20){//変更セルがS列以外なら処理終了 17 /* Sって19じゃね? */ 18 //if(myCell.getColumn() != 20){//変更セルがS列以外なら処理終了 19 if(myCell.getColumn() != 19){//変更セルがS列以外なら処理終了 20 return; 21 } 22 //○○の部分は完了とかのステータスが入る列番号 23 if ( sh.getRange('T' + myCell.getRow()).getValue() !== "完"){ 24 return; 25 } 26 27 var Name = sh.getRange(myCell.getRow(),19).getValue();//名前 28 var To = {"■■":"■■@gmail.com"};//アドレス 29 30 var seiban = sh.getRange(myCell.getRow(),6).getValue();//製番 31 var Order = sh.getRange(myCell.getRow(),7).getValue();//注文主 32 var Sitename = sh.getRange(myCell.getRow(),8).getValue();//納入先 33 var Cc = "○○@gmail.com"; 34 35// var person = sh.getRange('S' + myCell.getRow()).getValue();//「完」が入った行の営業担当 36 var person = myCell.getValue(); /* 誤解でなければSは編集中のセルのはず */ 37 38 var Subject = seiban + " " + Order;//メールタイトル 39 var Body = Name + "様\n" 40 + "\n" 41 + "・" + seiban + "  " + Sitename+"\n" 42 + "\n" 43 + "よろしくお願いいたします。\n" 44 + "\n";//メール本文 /* 致しますを漢字にするのは文章作法としてよくない */ 45 46 /* 判定はこういう感じじゃないかな */ 47 if(To[person] !== undefined) { 48 /* MailAppはFromをもてないはず */ 49 GmailApp.sendEmail(To[person],Subject, Body,{cc:Cc,from:"△△@gmail.com",name:"△△"}); 50 } 51} 52/* }が2個くらい多かったので消しました */

投稿2019/03/01 07:19

papinianus

総合スコア12705

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

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

0

  • 編集時トリガをかけること
  • 動作検証はしていない。未保証。メールアドレスがどこにあるかも、他の列が何なのかも、シート名が何なのかも開示しないのですから、確認のしようがありません。
  • いちおうtestが関数実行に対応する可能性がある

javascript

1function __test_q175701_onEdit() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const e = { 'range': sheet.getActiveCell(), 'value': sheet.getActiveCell().getValue()}; 4 q175701_onEdit(e); 5} 6function q175701_onEdit(e) { 7 const editingSheetName = e.range.getSheet().getName(); 8 const sheetName = "くれくれ"; 9 switch(editingSheetName) { 10 case sheetName: 11 MailMe(e); 12 return; 13 default: 14 return; 15 } 16} 17function MailMe(e) { 18 const col = e.range.getColumn(); 19 if(e.value !== "〇") return; 20 if(col < 23) return;// W == 23 21 if(col > 30) return;// AD == 30 22 const mailaddrs = ["a addr", "b addr", "c addr", "d addr", "e addr", "f addr", "g addr", "h addr"]; 23 const to = mailaddrs[col - 23]; 24 const sheet = e.range.getSheet(); 25 const row = e.range.getRow(); 26 const vals = sheet.getRange(row, 1, 1, 22).getValues()[0]; 27 const yousei = vals[2-1]; 28 const seiban = vals[5-1]; 29 const nushi = vals[6-1]; 30 const nouhin = vals[7-1]; 31 const from = vals[21-1]; 32 const to = vals[22-1]; 33 const subj = "まるされたよ"; 34 const body = [yousei, seiban, nushi, nouhin, from, to].join("/n"); 35 GmailApp.sendEmail(to, subje, body); 36}

質疑に回答してなかったのは質問者様なのに「まだ回答を求めています」ってなんかシステムとしておかしくね?

投稿2019/02/28 09:02

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問