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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

2264閲覧

[GAS]setValuesのExceptionが解決できない

peimish

総合スコア17

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2018/09/30 15:03

前提・実現したいこと

只今google app scriptでgmailの内容をスプレッドシートに出力するためのスクリプトを制作しています。
今までは日付・タイトル・送信者・メール本文のみを出力するスクリプトで運用していたのですが、
今回はgmailに添付ファイルがあればそれを取得し、一度google driveに保存し、
その保存されたファイルのリンクをスプレッドシートに出力する機能を実装したいと考えています。

一応gmailから添付ファイルを取得してdriveに保存し、
スプレッドシートにまとめて出力するために二重配列に整形するところまでは実装できたのですが、
どうしても最後のsetValuesのところでExceptionが出てしまいます。
for分で回して1セルごとにデータを出力していけば目的に沿った機能は実装できるのですが、
扱うメールの量が1000件を超えることもあるため、パフォーマンスを考えるとやはりまとめて出力したいと思っています。

Loggerを使って出力を見る限り最後に呼ぶ関数itemToRowまではうまく動いているようなので、問題は関数itemToRowの中でのattachmentの扱い方ではないかと考えています。
ですがどうにもExceptionが解決できずどうしたものかと手が止まってしまい、相談させていただきたく投稿いたしました。
何卒よろしくお願いいたします。

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

Exception: 5 は無効な範囲です。10 にする必要があります。

該当のソースコード

googleAppScript

1function mailToSheet () { 2 try { 3 // ----- ここから書き換え ----- 4 var SHEET_NAME = "シート1";// 書き込むシート名 5 var FOLDER_ID = "ここにIDを入れる";//添付ファイルを入れるgoogleDriveのフォルダID 6 var SEARCH_CONDITION = "has:attachment";// Gmailの抽出条件 7 // ----- ここまで書き換え ----- 8 9 var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを取得 10 var sheet = spreadSheet.getSheetByName(SHEET_NAME);//シートを取得 11 var sheetContent = sheet.getDataRange().getValues();//シートに記載されている内容を取得 12 var row = sheet.getDataRange().getLastRow();//スプレッドシートに記入されている最後の行を取得 13 var myFolder = DriveApp.getFolderById(FOLDER_ID);//フォルダを取得 14 15 var mail_data = getDataFromGmail(SEARCH_CONDITION, myFolder); 16 var new_mails = checkMailAlreadyExists(sheetContent, mail_data); 17 18 var values = itemToRow(new_mails); 19 20 sheet.getRange(row+1, 1, new_mails.length, 10).setValues(values);//メールをスプレッドシートに書き込む 21 Browser.msgBox(new_mails.length + "件の新規メールを追加しました!"); 22 }catch (err) { 23 Logger.log(err.toString()); 24 } 25} 26 27 function getDataFromGmail (SEARCH_CONDITION, myFolder) { 28 var threads = GmailApp.search(SEARCH_CONDITION,0,1); //条件にマッチするスレッドを取得 29 var mails = GmailApp.getMessagesForThreads(threads); 30 var mailInfo = []; 31 for (var i=0 ; i < mails.length; i++) { 32 for (var j=0; j < mails[i].length; j++) { 33 var mail = mails[i][j]; 34 var item = {}; 35 item["mailId"] = mail.getId(); 36 item["date"] = mail.getDate(); 37 item["subject"] = mail.getSubject(); 38 item["from"] = mail.getFrom(); 39 item["body"] = mail.getPlainBody(); 40 var attachments_url = getAttachmentFile(mail, myFolder); 41 for (var k = 0; k < attachments_url.length; k++) { 42 item["attachment" + (k+1)] = attachments_url[k]; 43 }; 44 mailInfo.push(item); 45 }; 46 }; 47 return mailInfo; 48 } 49 50 function checkMailAlreadyExists(sheetContent, mail_data) { 51 var new_mails = []; 52 var flag = false;//flagが true/既に記入済み false/まだ記入されてないメール 53 for (var i=0; i < sheetContent.length; i++){ 54 for (var j=0; j < mail_data.length; j++ ){ 55 var flag = false; 56 if (sheetContent[i][0].match(mail_data[j]["mailId"])){//スプレッドシートにあるmailIdとgmailから取得したメールのIDを比較する 57 flag = true; 58 break; 59 } 60 new_mails.push(mail_data[j]); 61 } 62 } 63 return new_mails; 64 } 65 66 function getAttachmentFile(gmail, myFolder){ 67 var attachments = gmail.getAttachments();//添付ファイルを取得 68 var attachments_url = []; 69 if (attachments.length == 0) { 70 attachments_url.push("No Attachment"); 71 return attachments_url; 72 }; 73 for(var i = 0; i < attachments.length; i++){ 74 var file = myFolder.createFile(attachments[i]);//ドライブに添付ファイルを保存 75 var attachment_url = file.getUrl();//添付ファイルのurlを取得 76 attachments_url.push(attachment_url); 77 }; 78 return attachments_url; 79 } 80 81 function itemToRow (mails) { 82 var rows = []; 83 for (var i=0; i < mails.length; i++) { 84 var row = []; 85 row[0] = mails[i]["mailId"]; 86 row[1] = mails[i]["date"]; 87 row[2] = mails[i]["subject"]; 88 row[3] = mails[i]["from"]; 89 row[4] = mails[i]["body"]; 90 for (var j=0; j < (mails[i].length - 5); j++) {//(mails[i].length - 5)=attachmetの数 91 row[j+5] = mails[i]["attachment" + (j+1)]; 92 }; 93 for (var k=0; k < 5-(mails[i].length - 5); k++) {//ここでとりあえずgetRangeで指定した10列分を"No Attachment"で埋めようと考えてるのですが... 94 row[k+5+(mails[i].length-5)] = "No Attachment"; 95 }; 96 rows.push(row); 97 }; 98 return rows; 99 } 100

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

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

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

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

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

guest

回答1

0

ベストアンサー

全体は見ていませんけど、こうだと思います。
0件の場合には処置が必要です。

gas

1sheet.getRange(row+1, 1, values.length, values[0].length).setValues(values);

投稿2018/09/30 16:36

shozi3

総合スコア691

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

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

peimish

2018/09/30 19:20

なるほど! 解決できました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問