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

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

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

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

Q&A

解決済

1回答

2170閲覧

GAS メール内容保存 ドライブ自動保存、保存先をスプレッドシートに記述 エラーについて

Yotpp

総合スコア5

Google Apps Script

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

0グッド

0クリップ

投稿2020/03/04 08:45

編集2020/03/04 08:47

GASで特定件名の受信内容と添付ファイルのドライブ自動保存、保存先をスプレッドシートに記述する動作を作成しています。

デバック中にに以下のエラーメッセージが発生しました。

☆次のオブジェクトを取得できません。イテレータが末尾に到達しました。(行 31、ファイル「コード」)
☆ 該当のソースコード
var hyperlink_formula = "=HYPERLINK("" + fol.getFilesByName(newName).next().getUrl() + "","" + newName + "")";
valMsgs.push([date,from,subj,body,msid,perm,attach,hyperlink_formula]);
}

★原因としては添付ファイルが無いメールもあるのでfol.getFilesByName(newName).next().getUrl()が実行できないと思われます。
var hyperlink_formula = もしくはvalMsgs.push([date,from,subj,body,msid,perm,attach,hyperlink_formula]);
の前に添付ファイル有り無しを確認することは可能なのでしょうか?
以下がコード全文になります

var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール蓄積テスト');

function searchContactMail() {

/* Gmailから特定条件のスレッドを検索しメールを取り出す */
var strTerms = '(subject:"件名+’’ OR "from:mail@address")';
var myThreads = GmailApp.search(strTerms,0,30);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);//二次元配列
var fol = DriveApp.getFolderById('添付ファイル保存先フォルダID');
var valMsgs = [];

/* 各メールから日時、送信元、件名、内容、ID、添付ファイルを取り出す */
for(var i=0;i<myMsgs.length;i++){
for(var j=0;j<myMsgs[i].length;j++){
var msid = myMsgs[i][j].getId();//メッセージIDを取得
//もしメッセージIDがスプレッドシートに存在しなければ
if(!hasId(msid)){
var date = myMsgs[i][j].getDate();
var from = myMsgs[i][j].getFrom();
var subj = myMsgs[i][j].getSubject();
var body = myMsgs[i][j].getPlainBody().slice(0,200);
var perm = myThreads[i].getPermalink();
var attach = myMsgs[i][j].getAttachments();
for(var k = 0; k < attach.length; k++){
var blobFile = attach[k];
var originalName = blobFile.getName();
var newName = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd/HH:mm (E)') + originalName ;
blobFile.setName(newName);
fol.createFile(blobFile);//ドライブに添付ファイルを保存
}
var hyperlink_formula = "=HYPERLINK("" + fol.getFilesByName(newName).next().getUrl() + "","" + newName + "")";
valMsgs.push([date,from,subj,body,msid,perm,attach,hyperlink_formula]);
}
}
}

 /* スプレッドシートに出力 */
if(valMsgs.length>0){//新規メールがある場合、末尾に追加する
var lastRow = mySheet.getDataRange().getLastRow();
mySheet.getRange(lastRow+1, 1, valMsgs.length, 8).setValues(valMsgs);
}
}

function hasId(id){

var data = mySheet.getRange(1, 5, mySheet.getLastRow(),1).getValues();//E列(メッセージID)を検索範囲とする
var hasId = data.some(function(value,index,data){//コールバック関数
return (value[0] === id);
});
return hasId;
}

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

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

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

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

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

papinianus

2020/03/04 12:58

ご自分で書いたコードでないとの想定です。 引用元を書いてください。それを公開している人の労力で利益を得ようとしているのに、その人の著作権をふみにじる真似をすると、そういう善意の人が減るだけで結局損をします。
Yotpp

2020/03/05 00:22

いろいろな方のコードを自分なりに組みなおしており、完全に引用はしていないのですが、どの部分がこれ、この部分はこれと引用元を掲示したほうがよろしいでしょうか? 自分もそれなりに時間を使って現状までたどり着きました。
Yotpp

2020/03/05 05:02

基本にした参考 コード https://tonari-it.com/gas-gmail-messageid/ ここに添付ファイルの保存先ハイパーリンクを追加できるように検索、探索して、いじくり回して、なんとか質問のできるところまでたどり着けました、、、、
guest

回答1

0

ベストアンサー

可能です。

では満足しないのでしょうね。

javascript

1 var hyperlink_formula = "=HYPERLINK(\"" + fol.getFilesByName(newName).next().getUrl() + "\",\"" + newName + "\")";

javascript

1 var hyperlink_formula = attach.length ? "=HYPERLINK(\"" + fol.getFilesByName(newName).next().getUrl() + "\",\"" + newName + "\")" : "";

でよいのではないかと想像します。

なお、この方法だとハイパーリンクされるのは最後の添付ファイル 1 個になってしまいます。元のコードの作者は何らかの前提をおいていたことが想像されます。


javascript

1var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール蓄積テスト'); 2 3function searchContactMail() { 4 5 /* Gmailから特定条件のスレッドを検索しメールを取り出す */ 6 var strTerms = '(subject:"件名+’’ OR "from:mail@address")'; 7 var myThreads = GmailApp.search(strTerms, 0, 30); 8 var myMsgs = GmailApp.getMessagesForThreads(myThreads);//二次元配列 9 var fol = DriveApp.getFolderById('添付ファイル保存先フォルダID'); 10 var valMsgs = []; 11 12 /* 各メールから日時、送信元、件名、内容、ID、添付ファイルを取り出す */ 13 for (var i = 0; i < myMsgs.length; i++) { 14 for (var j = 0; j < myMsgs[i].length; j++) { 15 var msid = myMsgs[i][j].getId();//メッセージIDを取得 16//もしメッセージIDがスプレッドシートに存在しなければ 17 if (!hasId(msid)) { 18 var date = myMsgs[i][j].getDate(); 19 var from = myMsgs[i][j].getFrom(); 20 var subj = myMsgs[i][j].getSubject(); 21 var body = myMsgs[i][j].getPlainBody().slice(0, 200); 22 var perm = myThreads[i].getPermalink(); 23 var attach = myMsgs[i][j].getAttachments(); 24 var links = ["","",""]; 25 for (var k = 0; k < attach.length; k++) { 26 var blobFile = attach[k]; 27 var originalName = blobFile.getName(); 28 var newName = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd/HH:mm (E)') + originalName; 29 blobFile.setName(newName); 30 var f = fol.createFile(blobFile);//ドライブに添付ファイルを保存 31 links.unshift(`=HYPERLINK("${f.getUrl()}","${newName}")`) 32 } 33 valMsgs.push([date, from, subj, body, msid, perm, attach].concat(links.slice(0,3))); 34 } 35 } 36 } 37 38 /* スプレッドシートに出力 */ 39 if (valMsgs.length > 0) {//新規メールがある場合、末尾に追加する 40 var lastRow = mySheet.getDataRange().getLastRow(); 41 mySheet.getRange(lastRow + 1, 1, valMsgs.length, 10).setValues(valMsgs); 42 } 43} 44 45function hasId(id) { 46 47 var data = mySheet.getRange(1, 5, mySheet.getLastRow(), 1).getValues();//E列(メッセージID)を検索範囲とする 48 var hasId = data.some(function (value, index, data) {//コールバック関数 49 return (value[0] === id); 50 }); 51 return hasId; 52}

投稿2020/03/04 13:01

編集2020/03/05 13:59
papinianus

総合スコア12705

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

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

Yotpp

2020/03/04 21:49

ありがとうございます、ちなみに最後の添付ファイルだけでなくするにはどのように打ち替えたら良いのでしょうか? 知識は特別なく、ネットからいろいろ検索して、自分なりに組み立てたので分からない事ばかりです。 お力添え頂きますと大変助かります。
papinianus

2020/03/05 03:24

最後のものだけでなくしたい、かつ、現状のエラーからすると、最大何個添付されているかは分からないということですか?もし、最大の添付数がわかるなら教えて欲しいです。
Yotpp

2020/03/05 05:03

ありがとうございます。 最大3個の添付ファイルまでとしたいです。
papinianus

2020/03/05 13:58

後ろから最大3つになるようなかきかたをしました。
Yotpp

2020/03/05 23:36

ただコピペするだけでなく、どこをどう変えていただいたのか わかる範囲で調べてから使わせていただくことにします。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問