いつもお世話になっております。
現在、社内の実績報告をファームで回答、内容をGASで指定した宛先に自動送信する、という
スクリプトを組んでおります。
しかし以下エラーが発生し解決できずにおります。
<エラー内容>
・二重、三重にメールが送信される人がいる。
・カンマ0.0何秒差で回答した場合、件名や回答内容が入れ替わることがある。(メールのみ、スプレットに集約しているデータは入れかわらない)
・そもそもメールが送られない。
当サイトにて同じような事象の改善方法として
イベントのソースを「スプレットシートから」ではなく「フォームから」に変更試みてみましたが、完全には改善されません。
(エラーの数は減った気がします。感覚地ですが・・)
ちなみに約300名が同時間帯に回答集中します。
それが原因なのかどうかもわかりませんが、
何か解決方法、ご教示頂けませんでしょうか。
ご参考に以下が、現在組んでいるスクリプトです。
function
1 Logger.log('sendMailGoogleForm() debug start'); 2 3 4 // メール送信先 5 var admin = "○○○@××.co.jp"; // 管理者アドレス 6 var sendername = "管理者";//送信者名(必須) 7 var cc = "○○○@××.co.jp"; // 8 var bcc = admin; // Bcc: 9 var reply = admin; // Reply-To: 10 var to = ''; // To: (入力者のアドレスが自動で入ります) 11 var d = new Date(); 12 var day = Utilities.formatDate(d,'JST', 'M/dd'); 13 14// -------------------------------------- 定義---------------------- 15 var Spreadsheet = SpreadsheetApp.openById("abcdefgh0123456789"); 16 var sheet = Spreadsheet.getSheetByName("メールフォーム"); //スプレッドとシートの指定 17 var ss = Spreadsheet.getSheetByName("宛先リスト"); 18 var atesaki = ss.getRange(3,2).getValue(); //宛先の指定 19// var atesaki2 = ss.getRange(4,2).getValue(); 20 var rows = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //A列の最終行を取得する 21 var cols = sheet.getLastColumn(); 22 var rg = sheet.getDataRange(); 23 Logger.log("rows="+rows+" cols="+cols); 24 var tenpo = sheet.getRange(rows, 5).getValue(); //件名に店舗名 25 var name = sheet.getRange(rows, 6).getValue(); //件名に氏名 26 27// ---------------------------------------------------------------- 28 // 設定エリアここから 29 //------------------------------------------------------------ 30 31 + "------------------------------------------------------------\n"; 32 // 件名、本文、フッター 33 34 var subject = "【日報】【"+day+"】"+tenpo+"/"+name+""; 35 var body = "※本メールは自動配信となります。\n\n各位\n\nお疲れ様です。\n本日の実績報告となります。\n\n"// 36 var footer = "------------------------------------------------------------\n\n" + "以上、よろしくお願いいたします。";// 37 38 // 入力カラム名の指定 39 var NAME_COL_NAME = '名前'; 40 var MAIL_COL_NAME = 'メールアドレス'; 41 42 //------------------------------------------------------------ 43 // 設定エリアここまで 44 //------------------------------------------------------------ 45 46 try{ 47 // スプレッドシートの操作 48 var sheet = Spreadsheet.getSheetByName("メールフォーム"); 49 var rows = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 50 var cols = sheet.getLastColumn(); 51 var rg = sheet.getDataRange(); 52 Logger.log("rows="+rows+" cols="+cols); 53 54 // メール件名・本文作成と送信先メールアドレス取得 55 for (var i = 1; i <= cols; i++ ) { 56 var col_name = rg.getCell(1, i).getValue(); // カラム名 57 var col_value = rg.getCell(rows, i).getValue(); // 入力値 58 59if (col_name === "タイムスタンプ"){ 60 continue;} 61 62 body += col_name + "\n"; 63 body += col_value + "\n\n"; 64 if ( col_name === NAME_COL_NAME ) { 65 body = col_value+" 様\n\n"+body; 66 } 67 if ( col_name === MAIL_COL_NAME ) { 68 to = col_value; 69 } 70 } 71 body += footer; 72 73 // 送信先オプション 74 var options = {name: sendername}; 75 if ( cc ) options.cc = cc; 76 if ( bcc ) options.bcc = bcc; 77 if ( reply ) options.replyTo = reply; 78 79 // メール送信 80 if ( atesaki ) { 81 MailApp.sendEmail(atesaki, subject, body, options); 82 }else{ 83 MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body); 84 } 85 }catch(e){ 86 MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message); 87 } 88 } 89 90コード
・
エラーの種類は変わりましたか?変わりませんか?
短時間に回答が集中するということですが、例えば就業後1時間後にまとめて送信する、というのはだめなんですか?
これを表計算ツールとアンケートツールでやる意味がないのですがグループウェアを導入することも考えては?
回答頂きありがとうございます。
エラーの種類は変わりませんでした。
就業後にまとめてというのは、
回答者は自分のタイミングで回答し
集約した回答内容を一時間後にまとめて配信
であれば大丈夫です!
方法としては排他制御で一時間と設定するということでしょうか?
グループウェアについては、
会社の仕組み上、申請してすぐにとはいかないので
現状は今のスクリプトと使って行きたいと思っています。
何かお知恵を分けて頂けると幸いです????????
lockの方法を検索しましたら下記の記事を見つけました。
当方は検証していません。
http://kakts-tec.hatenablog.com/entry/2016/12/17/162931
kikukiku様
お調べいただきありがとうございます。
実は私もこちらのサイトを参考に色々してみましたがうまくいきません。。
そもそも、もしかして今組んでるスクリプトが"メール内容はフォームの回答の最終行を取得"
ってことになってるので、lockを何秒かけようと意味ない・・??
という発想に至ってしまいました・・
lockを試したのなら、具体的にどのようなソースで試して、
結果としてどのような動作になって、動作しないと判断したのかを書かないと
誰も回答できないと思います。