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

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

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

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

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

1回答

554閲覧

GAS。関数による間違い検出が働かないのです。

aass12

総合スコア2

Google スプレッドシート

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

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2020/05/18 12:02

編集2020/05/18 13:43

GASで、メールを送信するプログラムを作っています。
spreadsheet上に空欄があれば、popupAttached(関数)により処理が止まるようにしたいのですが、どうも機能していません。一度、個々のプログラムで動作確認してから関数として入れています。(途中で元のプログラムから変更していますが)

送信先のメールアドレスを一か所、空欄にしているのですが、動いておらず

Exception: メールを送信できませんでした: 受信者が指定されていません

と表示されます。タイトルも空欄にして試したのですが、エラーとなりませんでした。

GAS

1function mail(){ 2 3 /*下準備  spreadsheet、document,driveの指定を行う*/ 4 const sheet = SpreadsheetApp.getActiveSheet();  //spreadsheetをアクティブ化 5 const lastRow = sheet.getLastRow(); //最終行の取得 6 const document_id = 'xxxxxxx'; //dcumentのid 7 const doc = DocumentApp.openById(document_id); 8 const docText = doc.getBody().getText(); 9 const drive_id ='xxxxxxxx'  //ファルダ―ID 10 const folder = DriveApp.getFolderById(drive_id); //driveのフォルダー指定 11 12 13      /*spreadsheetData*/ 14 const todayDate = sheet.getRange('H1').getValue();//NOW()関数で自動入力 15 const senderName = sheet.getRange('H2').getValue();//差出⼈名 16 const subject = sheet.getRange('H3').getValue();//タイトルが空であればエラーを吐く。(関数で判断) 17 const CC = sheet.getRange('H4').getValue();//CCの指定 18 const BCC = sheet.getRange('H5').getValue();//BCCの指定 19 const mailReplayIsok = sheet.getRange('H6').getValue();//replayの有無 20 const mailReplayTo = sheet.getRange('H7').getValue();//replay先の変更 21 const extention = sheet.getRange('H8').getValue();//ファイルの拡張子指定 22 const arrayData = ['B','C','D','F']; 23 24 try{ 25 /*メール送信前にspreadsheetに抜けがないかの確認。もし、抜けていたら。処理を終了させる。*/ 26 for(let j = 0; j < 4; j++){ 27 let contentArr = arrayData[j] + ':' + arrayData[j] 28 let Length = sheet.getRange(contentArr).getValues().filter(String).length; 29 let zero =Istrue(Length,lastRow) 30 if(zero ==0); 31 else{ 32 for(;Length < lastRow; Length++){ 33 let ans = sheet.getRange(j + 2, Length).isBlank(); 34 if(ans =='true'){ 35 popupAttached(arrayData[j] + Length,'を入力してください。'); 36 } 37 } 38 } 39 } 40 41 /*添付ファイルと拡張子の両方が入力されているか?*/ 42 XOR(recognize(sheet.getRange(3, 6).getValue()),recognize(extention)); 43 44 /*メール送信。 forLoopでdocumentの置換を行い、個々のdocument作成。その後送信。*/ 45 for(let i = 2; i <= lastRow; i++){ 46     /*spreadsheetからデータを取得*/ 47 const lastName = sheet.getRange(i, 2).getValue(); //姓 48 const firstName = sheet.getRange(i, 3).getValue(); //名 49 const score = sheet.getRange(i, 4).getValue(); //通知する点数 50 const recipientName = sheet.getRange(i, 5).getValue();//宛先 51 const attached = sheet.getRange(i, 6).getValue(); //添付ファイル 52 const body = docText //置換置換処理 53 .replace('{送信日}',todayDate) 54 .replace('{姓}',lastName) 55 .replace('{名}',firstName) 56 .replace('{点数}',score); 57 const attachedFile = attached + '.' + extention 58// const data = folder.getFilesByName('attachedFile').next().getBlob(); 59 60// const options = {name: senderName, cc: CC,bcc: BCC,noReply: mailReplayIsok,replyTo: mailReplayTo};//差出人、CC、BCC、replayの有無、replay先の変更を設定 61   GmailApp.sendEmail(recipientName,subject,body);//メール送信 ,options 62 } 63 }catch(e){ 64 console.error("エラー:", e.message); 65 } 66} 67 68 69function recognize(value){ //空であるか確認。 70 if(value == null){ 71 return 1; 72 }else{ 73 return 0; 74 } 75} 76 77 78function XOR(x, y){ 79 const ans = x*1-y*1; 80 if(ans == 0){ 81 return ; 82 }else{ 83 if(x == 0){ 84 popupAttached('添付ファイル名','を入力してから実行ボタンを押してください。n\添付ファイルを送信するには、ファイルの拡張子','添付ファイル名の両方の入力が必要です。'); 85 }else{ 86 popupAttached('ファイルの拡張子','を入力してから実行ボタンを押してください。n\添付ファイルを送信するには、ファイルの拡張子','添付ファイル名の両方の入力が必要です。'); 87 } 88 } 89} 90 91 //ポップアップ警告処理。タイトル 92function popupTitle(){ 93 const rezult = Browser.msgBox("タイトルが入力されていません。\nタイトルなしで送信されますか?", Browser.Buttons.YES_NO); 94 if(rezult == "yes"){ 95 const flag = Browser.msgBox("本当によろしいでしょうか?", Browser.Buttons.YES_NO); 96 if(flag == "no"){ 97 Browser.msgBox("タイトルを再入力してから実行してください。", Browser.Buttons); 98 throw new Error('終了します。タイトルのミス'); 99 }else;//実行される。 100 }else{ 101 Browser.msgBox("タイトルを再入力してから実行してください。", Browser.Buttons); 102 throw new Error('終了します。タイトルのミス'); 103 } 104} 105 106 //ポップアップで終了のお知らせ。 107function popupAttached(message1, message2){ 108 Browser.msgBox( message1 + 'がemptyです。n\' + message1 + message2, Browser.Buttons); 109 throw new Error('終了します' + message1 +'のミス'); 110} 111 112 113function Istrue(sheet,lastraw){ 114 if(sheet == lastraw ) { 115 return 0; 116 }else{ 117 return 1; 118 } 119}

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

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

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

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

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

draq

2020/05/18 12:17

スプレッドシートからスクリプトエディタを開いて作成しているのでしょうか?
aass12

2020/05/18 13:45

ご指摘ありがとうございます。 スプレッドシート上で開いていませんでした。 しかし、スプレッドシート上で実行し直してもうまくポップアップでの表示が表れてくれません。
guest

回答1

0

こんにちは、少しコードを見ただけですが以下が怪しいと思われます。
修正前

Javascript

1if (ans == "true") { 2 popupAttached(arrayData[j] + Length, "を入力してください。"); 3}

修正後

Javascript

1if (ans) { 2 popupAttached(arrayData[j] + Length, "を入力してください。"); 3}

にしたらどうでしょうか?

投稿2020/05/18 15:26

fake_shibe

総合スコア806

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問