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;
}
回答1件
あなたの回答
tips
プレビュー