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

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

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

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

JavaScript

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

Q&A

解決済

2回答

656閲覧

エラーの原因がわからない

kouID

総合スコア2

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/11/20 09:24

function myfanction(){
const FOLDER_ID = "フォルダID";
const SEARCH_TERM = 'subject:(テスト) ';
const folder = DriveApp.getFolderById(FOLDER_ID);
const threads = GmailApp.search(SEARCH_TERM, 0, 50);
const messages = GmailApp.getMessagesForThreads(threads);

for(const thread of messages){
for(const message of thread){
const attachments = message.getAttachments();
const mailAddress = message.getFrom().replace(/^.+<([^>]+)>$/, '$1');
const contacts = ContactsApp.getContactsByEmailAddress(mailAddress);
const name = contacts[0].getFamilyName();

for(const attachment of attachments){ const file = folder.createFile(attachment); const newFileName = name + file.getName(); file.setName(newFileName); Logger.log('ファイル名「' + newFileName + '」をフォルダに作成しました。') } }

}
}

上記コードを使うと毎回ではないがエラーがでた。エラー内容は
TypeError: Cannot read property 'getFamilyName' of undefined
myfanction @ コード.gs:13

調べてみましたが、何が悪いのかさっぱりわかりません。
どなたかご教授頂けませんか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

連絡先に存在しないメールアドレスの場合、contactsがnullになり、
そのエラーが発生しているのかもしれません。

下記のように、contactsが取得できない場合は、nameをメール自体の差出人名とする対応ではいかがでしょうか。
(先頭+の行は追加、-の行は削除)

diff

1function myfanction() { 2 const FOLDER_ID = "フォルダID"; 3 const SEARCH_TERM = "subject:(テスト) "; 4 const folder = DriveApp.getFolderById(FOLDER_ID); 5 const threads = GmailApp.search(SEARCH_TERM, 0, 50); 6 const messages = GmailApp.getMessagesForThreads(threads); 7 8 for (const thread of messages) { 9 for (const message of thread) { 10 const attachments = message.getAttachments(); 11 const mailAddress = message.getFrom().replace(/^.+<([^>]+)>$/, "$1"); 12 const contacts = ContactsApp.getContactsByEmailAddress(mailAddress); 13- const name = contacts[0].getFamilyName(); 14+ let name = ''; 15+ if (contacts && contacts.length > 0) 16+ name = contacts[0].getFamilyName(); 17+ else 18+ name = message.getFrom(); 19 20 21 for (const attachment of attachments) { 22 const file = folder.createFile(attachment); 23 const newFileName = name + file.getName(); 24 file.setName(newFileName); 25 Logger.log( 26 "ファイル名「" + newFileName + "」をフォルダに作成しました。" 27 ); 28 } 29 } 30 } 31} 32

投稿2021/11/20 09:40

編集2021/11/20 09:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kouID

2021/11/20 09:59

早速の回答ありがとうございます。度々すみません。 ご教授頂いた分を足してみます。
guest

0

TypeError: Cannot read property 'getFamilyName' of undefined

エラーメッセージからすると恐らく getContactsByEmailAddress() が失敗している(メールアドレスが見つからなかった)のではないかと思います。
指定したメールアドレスがContactに見つからない為、contacts[0]undefined なのだと思います。
その場合、undefinedgetFamilyName() メソッドを呼び出すことが出来ない為、エラーになります。

javascript

1const contacts = ContactsApp.getContactsByEmailAddress(mailAddress); 2const name = contacts[0].getFamilyName(); // contacts[0] が undefined の場合、エラー

投稿2021/11/20 09:39

cx20

総合スコア4633

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

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

kouID

2021/11/20 10:01

回答ありがとうございます。getContactsByEmailAddressがエラーの原因だったのですね。 エラー内容しっかり理解してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問