スプレッドシートの値を参照してメール送信する際、送信内容を確認した上でボタン押下で送信したい

591 views
Skip to first unread message

matsuda yuka

unread,
Jan 9, 2014, 6:27:34 PM1/9/14
to google-app...@googlegroups.com
こんにちは、松田と申します。質問させてください。

以下のような処理を行いたいと思っています。

  (1)指定した行のスプレッドシートの値(メールアドレス、件名、本文など)を参照
  (2)メールの文面作成
  (3)メールの送信内容をスプレッドシート上に表示
  (4)「OK」ボタン押下で、メール送信

このうち、(3)の処理を、msgBox()関数を利用すれば実現できるところまで行き着いたのですが、
メールが長文になると、msgBoxでは幅が狭くて見にくいです。

そのため、(3)の確認画面をUiappを用いて表示・ボタン押下する処理にしたいと考えています。

その際、ボタンクリック時に必要な引数を渡してメールを送信する方法が分からず躓いています(><)
恐れ入りますが、どなたかご教示頂けませんでしょうか。。。

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

<Scriptの抜粋>
 
  function invitationMail() {
     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var sheet = ss.getSheetByName(SHEET_NAME_LIST);

     var mail_type = "ご案内メール";
     var selected_row = selectedRow(mail_type);
     var target_datas = sheet.getRange(selected_row,1,selected_row, LIST_FORM_END).getValues();
  
    (略)
     
     createInvitationMail(target_lesson_date,target_lesson_course,target_name, target_mailaddress); 
  } 

 function createInvitationMail(target_lesson_date,target_lesson_course,target_name, send_mailaddress) {
  
   (略)

   doGet(send_mailaddress,target_name,subject,body);
    sendMail(send_mailaddress, subject, body);  ←確認画面のボタン押下時のみ、この処理を行いたい
  }

 function selectedRow(mail_type){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName(SHEET_NAME_LIST);
  
   var selectedRow = Browser.inputBox(mail_type + "送信",
       '送信したい方の行番号を入力してください' +
       ' (入力例: 2):',
       Browser.Buttons.OK_CANCEL);
  
  (略)
  
  return selectedRow;
}

function doGet(send_mailaddress,target_name,subject,body){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var app = UiApp.createApplication().setTitle("以下の内容でメールを送信しますか?")
  .setHeight(500).setWidth(800);//★フォームのタイトル
  
  var grid = app.createGrid(3,2).setWidth(800);//★行数,列数
  grid.setWidget(0, 0, app.createLabel("■宛先 :"+ target_name + "様"));
  grid.setWidget(1, 0, app.createLabel("■件名 :"+ subject));
  grid.setWidget(2, 0, app.createLabel("■本文 :"+body));
 
  var panel = app.createVerticalPanel();
  panel.add(grid);
  
*ここから下が、もう意味不明に・・・・・

  var button = app.createButton("メールを送信する");
//  button.addClickHandler(sendMail(send_mailaddress,subject,body));
 //入力フォームの値をPostMailに渡します
  var handler = app.createServerClickHandler('test');
  
//  var handler = app.createClientHandler()
//     .forEventSource().setEnabled(false);

  handler.addCallbackElement(grid);
  var result = button.addClickHandler(handler);
  
  
  panel.add(button);
  app.add(panel);  
  ss.show(app);
  
  return app;
}

function test(){
//  var app = UiApp.getActiveApplication();
  var button_clicked = "true";
  
   app.close();
  return button_clicked;
//  return app;
}

Takashi Yokoyama

unread,
Jan 9, 2014, 10:38:33 PM1/9/14
to google-app...@googlegroups.com
松田さん

横山@GDG中国です。

こんにちは。

主旨と違っていたら申し訳ないのですが、ダイアログ表示時と、
メール送信前に毎回Spreadsheetから値を取ったらいかがでしょうか。
(処理時間が気になるところですが、単純になるので、
ひとまずわかりやすくなるかと思いますが…)

function onOpen(e) {
  var subMenus = [{name: "メール送信Dialog表示", functionName: "doGet"}];

  SpreadsheetApp.getActiveSpreadsheet().addMenu("テストメニュー", subMenus);
}

// 最初に承認が必要です。
function doGet() {

  // データの取り方は適当
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var params = ss.getRange("A1:A3").getValues();
  var target_name = params[0][0];
  var subject = params[1][0];
  var body = params[2][0];
  
  var app = UiApp.createApplication().setTitle("以下の内容でメールを送信しますか?")
  .setHeight(500).setWidth(800);//★フォームのタイトル
  
  var grid = app.createGrid(3,2).setWidth(800);//★行数,列数
  grid.setWidget(0, 0, app.createLabel("■宛先 :"+ target_name + "様"));
  grid.setWidget(1, 0, app.createLabel("■件名 :"+ subject));
  grid.setWidget(2, 0, app.createLabel("■本文 :"+body));
 
  app.add(grid);
  
  var button = app.createButton("メールを送信する", app.createServerHandler('onClick'));
  app.add(button);

  SpreadsheetApp.getActiveSpreadsheet().show(app);
}

// ダイアログのボタンが押された時のコールバック
function onClick(e) {
  var app = UiApp.getActiveApplication();
  
  // データの取り方は適当
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var params = ss.getRange("A1:A3").getValues();
  var send_mailaddress = params[0][0];
  var subject = params[1][0];
  var body = params[2][0];
  
  sendMail(send_mailaddress, subject, body);
  
  app.close();

  return app;
}

function sendMail(send_mailaddress, subject, body) {
  // メールを飛ばす。(ダミー)
  Logger.log("■宛先 :"+ send_mailaddress + "様");
  Logger.log("■件名 :"+ subject);
  Logger.log("■本文 :"+body);
  
  // 本当はこんな感じで?
  //MailApp.sendEmail(target_name, subject, body);
}



2014年1月10日 8:27 matsuda yuka <mas...@mypleis.com>:

--
このメールは Google グループのグループ「Google Apps API Japan」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、google-apps-api-...@googlegroups.com にメールを送信します。
このグループに投稿するには、google-app...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
Takashi Yokoyama
GDG Chugoku Manager

tksyo...@gmail.com
http://sites.google.com/site/gdgchugokuofficial/
G+: http://goo.gl/VV3eJ
twitter: @GDGChugoku

matsuda yuka

unread,
Jan 10, 2014, 12:42:19 AM1/10/14
to google-app...@googlegroups.com
横山さん、

早々にご回答有難うございます!
「2回呼び出す」こと、思いつきませんでしたので、発想の転換になります。

一回、その発想でスクリプト修正してみます!
もし躓いたらまたお世話になるかもしれませんが。。。。。

取り急ぎ、お礼まで^^

松田
 


2014年1月10日 12:38 Takashi Yokoyama <tksyo...@gmail.com>:
このトピックの登録を解除するには、https://groups.google.com/d/topic/google-apps-api-japan/HCHvjct747E/unsubscribe にアクセスします。このグループから退会し、グループのすべてのトピックの登録を解除するには、google-apps-api-...@googlegroups.com にメールを送信します。

matsuda yuka

unread,
Jan 10, 2014, 12:54:02 AM1/10/14
to google-app...@googlegroups.com
送信した直後にごめんなさい!!

今回、スプレッドシートの「固定行」ではなく、
都度「何行目か」をinputBoxで入力してもらうようにしようと考えています。

その際、”function onClick(e)”に、inputBoxで指定された行数を
引き渡すことは可能でしょうか・・・?

ご回答頂いた内容を基に、初めからUiで行数を指定してもらうことも考えたのですが、
「行数入力用ポップアップ」⇒「メール確認用ポップアップ」と2つのUiが必要となるので
やはり値の引き渡しができない・・・と頭を抱えてしまいました(><)


2014年1月10日 12:38 Takashi Yokoyama <tksyo...@gmail.com>:
松田さん
このトピックの登録を解除するには、https://groups.google.com/d/topic/google-apps-api-japan/HCHvjct747E/unsubscribe にアクセスします。このグループから退会し、グループのすべてのトピックの登録を解除するには、google-apps-api-...@googlegroups.com にメールを送信します。

Takashi Yokoyama

unread,
Jan 10, 2014, 2:49:59 AM1/10/14
to google-app...@googlegroups.com
松田さん

横山@GDG中国です。

でしたら、
app.createServerHandler('onClick').addCallbackElement(text);
として、クリック時にElementを受け取るようにすれば取れます。

以下の例はTextBoxを使っていますが、setName()で名前をつけておいて、登録すると、
onClickのパラメータに値が入ってくるようになります。
TextBoxでなくても、Labelなどでも同様に取得できると思います。

パラメータからアクセスするメンバ名がsetName()で指定したものと同じ名前になります。

// 最初に承認が必要です。
function doGet() {

  // データの取り方は適当
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var params = ss.getRange("A1:A3").getValues();
  var target_name = params[0][0];
  var subject = params[1][0];
  var body = params[2][0];
  
  var app = UiApp.createApplication().setTitle("以下の内容でメールを送信しますか?")
  .setHeight(500).setWidth(800);//★フォームのタイトル
  
  // ポイント1
  var text = app.createTextBox().setName("startrowno");
  var grid = app.createGrid(4,2).setWidth(800);//★行数,列数
  grid.setWidget(0, 0, app.createLabel("■宛先 :"+ target_name + "様"));
  grid.setWidget(1, 0, app.createLabel("■件名 :"+ subject));
  grid.setWidget(2, 0, app.createLabel("■本文 :"+body));
  // ポイント2
  grid.setWidget(3, 0, text);
 
  app.add(grid);
  
  // ポイント3
  var button = app.createButton("メールを送信する", app.createServerHandler('onClick').addCallbackElement(text));
  app.add(button);

  SpreadsheetApp.getActiveSpreadsheet().show(app);
}

// ダイアログのcloseボタンが押された時のコールバック
// ポイント4
function onClick(e) {
  var app = UiApp.getActiveApplication();
  
  // データの取り方は適当
  // ポイント5
  var text = e.parameter.startrowno;
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var params = ss.getRange("A" + text + ":A3").getValues();
  var send_mailaddress = params[0][0];
  var subject = params[1][0];
  var body = params[2][0];
  
  sendMail(send_mailaddress, subject, body);
  
  app.close();

  return app;
}




2014年1月10日 14:54 matsuda yuka <mas...@mypleis.com>:

matsuda yuka

unread,
Jan 10, 2014, 3:54:58 AM1/10/14
to google-app...@googlegroups.com
横山さん、

またまた迅速なご回答ありがとうございます!
頭が少し追い付いていないので、書いてくださったスクリプトを
参考に、いじってみます!

取り急ぎ、お礼まで

松田


2014年1月10日 16:49 Takashi Yokoyama <tksyo...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages