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

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

ただいまの
回答率

88.80%

GAS メールより必要要項を取り出してスプレッドシート へ添付がしたいです

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 375

nezumimuzen

score 14

前提・実現したいこと

コード
Google App Script


ここに質問の内容を詳しく書いてください。
当方非プログラマーですが、GASでメールを取得後スプレッドシート へ必要要項を転記するプログラムをWeb上のサンプルやその他関連コードを参照しながら作っているのですが下記エラーが発生し解決ができず質問いたしました。

やりたいこと
Gmailにて「会員登録」とラベル振り分けした未読メールを取得

下記のようなメールの(名前、かな、性別、生年月日、郵便番号、住所、メールアドレス、電話番号)を抽出しスプレッドシート の指定の列に転記

転記後の未読メールを既読へ

元のメールデータ/例文

┏━━━━━━━━━━━━━━┓
[名前] : ああ
[かな(名前)] : ああ
[職業] : 会社員
[性別] : 女性
[生年月日] : 1900年1月1日
[郵便番号]: 2310000
[都道府県] : 東京都
[住所1] : あああ
[住所2] : あああ
[電話番号] : 09000000000
[メールアドレス] : 000000@000.com
┗━━━━━━━━━━━━━━┛

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

エラーメッセージ
TypeError: Cannot read property '0' of null(行 34、ファイル「test」)

該当のソースコード

ソースコード
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getRange(7, 21, sheet.getLastRow()  + 1).getValues();

function getMail01(){
 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シート名を記入。
 var objSheet = objSpreadsheet.getSheetByName("test"); 
 var sheet = SpreadsheetApp.setActiveSheet(objSheet);
 var start = 0;

 // 取得するメールの最大件数
 var max = 100;

 // Gmailのラベル名
 var threads = GmailApp.search('label:会員登録 is:unread',start,max);
 
 var Messages = GmailApp.getMessagesForThreads(threads);
 var row = sheet.getLastRow() + 1;

 // 見出しがあるためシートの1行目を固定  
 sheet.setFrozenRows(1);

 // メールから日時、要項を取り出す//
 for(var i = 0; i < Messages.length; i++) {
   for(var j = 0; j < Messages[i].length; j++) {

     var body = Messages[i][j].getPlainBody();
     var date = threads[i].getMessages()[j].getDate();

     var regName = new RegExp('[名前] : ' + '.*?' + '\r');
     var Name = body.match(regNumber)[0].replace('[名前] : ', '').replace('\r', '');
     var regKana = new RegExp('[かな(名前)] : ' + '.*?' + '\r' );
     var Kana = body.match(regName)[0].replace('[かな(名前)] : ', '').replace('\r', '');
     var regGender = new RegExp('[性別] : ' + '.*?' + '\r' );
     var Gender = body.match(regCategory)[0].replace('[性別] : ', '').replace('\r', '');
     var regTrack = new RegExp('[郵便番号]: ' + '.*?' + '\r' );
     var Track = body.match(regMoney)[0].replace('[郵便番号]: ', '').replace('\r', '');
     var regTrack2 = new RegExp('[都道府県]: ' + '.*?' + '\r' );
     var Track2 = body.match(regMoney)[0].replace('[都道府県]: ', '').replace('\r', '');
     var regTrack3 = new RegExp('[住所1]: ' + '.*?' + '\r' );
     var Track3 = body.match(regMoney)[0].replace('[住所1]: ', '').replace('\r', '');
     var regTrack4 = new RegExp('[住所2]: ' + '.*?' + '\r' );
     var Track4 = body.match(regMoney)[0].replace('[住所2]: ', '').replace('\r', '');
     var regPhone = new RegExp('[電話番号] : ' + '.*?' + '\r' );
     var Phone = body.match(regTantou)[0].replace('[電話番号] : ', '').replace('\r', '');
     var regBirth = new RegExp('[生年月日] : ' + '.*?' + '\r' );
     var Birth = body.match(regTantou)[0].replace('[生年月日] : ', '').replace('\r', '');
     var regMail = new RegExp('[メールアドレス] : ' + '.*?' + '\r' );
     var Mail = body.match(regBusu)[0].replace('[メールアドレス] : ', '').replace('\r', '');



 // 同じメールを読み込まないように、メッセージを既読にする
 threads[i].markRead();

 // それぞれの項目をセルを指定してスプレッドシートへ転記
 sheet.getRange(row,1).setValue([Name]);
 sheet.getRange(row,2).setValue([Kana]);
 sheet.getRange(row,3).setValue([Gender]);
 sheet.getRange(row,4).setValue([Track]);
 sheet.getRange(row,5).setValue([Track2]);
 sheet.getRange(row,6).setValue([Track3]);
 sheet.getRange(row,7).setValue([Track4]);
 sheet.getRange(row,8).setValue([Phone]);
 sheet.getRange(row,9).setValue([Birth]);
 sheet.getRange(row,10).setValue([Mail]);
 row++

    }
}
}

試したこと

何かの関数が返っていないものと思っていますが原因がわかりません。
また、プログラムを動かすにあたって足りない部分などありましたら可能な限りお教えいただければと思います。
回答よろしくお願いいたします。

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こんにちは、以下の場所でエラーが出ていると思われるので、

     var regName = new RegExp('[名前] : ' + '.*?' + '\r');
     var Name = body.match(regNumber)[0].replace('[名前] : ', '').replace('\r', '');
     var regKana = new RegExp('[かな(名前)] : ' + '.*?' + '\r' );
     var Kana = body.match(regName)[0].replace('[かな(名前)] : ', '').replace('\r', '');
     var regGender = new RegExp('[性別] : ' + '.*?' + '\r' );
     var Gender = body.match(regCategory)[0].replace('[性別] : ', '').replace('\r', '');
     var regTrack = new RegExp('[郵便番号]: ' + '.*?' + '\r' );
     var Track = body.match(regMoney)[0].replace('[郵便番号]: ', '').replace('\r', '');
     var regTrack2 = new RegExp('[都道府県]: ' + '.*?' + '\r' );
     var Track2 = body.match(regMoney)[0].replace('[都道府県]: ', '').replace('\r', '');
     var regTrack3 = new RegExp('[住所1]: ' + '.*?' + '\r' );
     var Track3 = body.match(regMoney)[0].replace('[住所1]: ', '').replace('\r', '');
     var regTrack4 = new RegExp('[住所2]: ' + '.*?' + '\r' );
     var Track4 = body.match(regMoney)[0].replace('[住所2]: ', '').replace('\r', '');
     var regPhone = new RegExp('[電話番号] : ' + '.*?' + '\r' );
     var Phone = body.match(regTantou)[0].replace('[電話番号] : ', '').replace('\r', '');
     var regBirth = new RegExp('[生年月日] : ' + '.*?' + '\r' );
     var Birth = body.match(regTantou)[0].replace('[生年月日] : ', '').replace('\r', '');
     var regMail = new RegExp('[メールアドレス] : ' + '.*?' + '\r' );
     var Mail = body.match(regBusu)[0].replace('[メールアドレス] : ', '').replace('\r', '');


下の様な感じで、 body.match(上で書いた変数)にしっかり変数を代入すればエラーが出ないと思います。

    var regName = new RegExp('[名前] : ' + '.*?' + '\r');
    var Name = body.match(regName)[0].replace('[名前] : ', '').replace('\r', '');
    var regKana = new RegExp('[かな(名前)] : ' + '.*?' + '\r' );
    var Kana = body.match(regKana)[0].replace('[かな(名前)] : ', '').replace('\r', '');
    var regGender = new RegExp('[性別] : ' + '.*?' + '\r' );
    var Gender = body.match(regGender)[0].replace('[性別] : ', '').replace('\r', '');
    var regTrack = new RegExp('[郵便番号]: ' + '.*?' + '\r' );
    var Track = body.match(regTrack)[0].replace('[郵便番号]: ', '').replace('\r', '');
    var regTrack2 = new RegExp('[都道府県]: ' + '.*?' + '\r' );
    var Track2 = body.match(regTrack2)[0].replace('[都道府県]: ', '').replace('\r', '');
    var regTrack3 = new RegExp('[住所1]: ' + '.*?' + '\r' );
    var Track3 = body.match(regTrack3)[0].replace('[住所1]: ', '').replace('\r', '');
    var regTrack4 = new RegExp('[住所2]: ' + '.*?' + '\r' );
    var Track4 = body.match(regTrack4)[0].replace('[住所2]: ', '').replace('\r', '');
    var regPhone = new RegExp('[電話番号] : ' + '.*?' + '\r' );
    var Phone = body.match(regPhone)[0].replace('[電話番号] : ', '').replace('\r', '');
    var regBirth = new RegExp('[生年月日] : ' + '.*?' + '\r' );
    var Birth = body.match(regBirth)[0].replace('[生年月日] : ', '').replace('\r', '');
    var regMail = new RegExp('[メールアドレス] : ' + '.*?' + '\r' );
    var Mail = body.match(regMail)[0].replace('[メールアドレス] : ', '').replace('\r', '');

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/25 08:56

    回答ありがとうございます。
    変数の間違いに気付いておりませんでした。
    解決すると思い早速変数を正しく入力し実行してみたのですが、

    var Name = body.match(regName)[0].replace('[名前] : ', '').replace('\r', '');

    上記32行部分に対し「TypeError: Cannot read property '0' of null(行 32、ファイル「test」)」
    とエラーが出てしまい、解決できませんでした。。

    キャンセル

  • 2020/05/25 09:20

    new RegExp("ここにかいてあるものが")の部分が一致していないので、body.match(regName)[0]でエラーが発生しているんだと思います。
    下のコードにしたらどうでしょうか?

    var regName = new RegExp('\\[名前\\] : ' + '.*');
    var Name = body.match(regName)[0].replace('[名前] : ', '').replace('\r', '');
    var regKana = new RegExp('\\[かな\\(名前\\)\\] : ' + '.*');
    var Kana = body.match(regKana)[0].replace('[かな(名前)] : ', '').replace('\r', '');
    var regGender = new RegExp('\\[性別\\] : ' + '.*');
    var Gender = body.match(regGender)[0].replace('[性別] : ', '').replace('\r', '');
    var regTrack = new RegExp('\\[郵便番号\\]: ' + '.*');
    var Track = body.match(regTrack)[0].replace('[郵便番号]: ', '').replace('\r', '');
    var regTrack2 = new RegExp('\\[都道府県\\]: ' + '.*');
    var Track2 = body.match(regTrack2)[0].replace('[都道府県]: ', '').replace('\r', '');
    var regTrack3 = new RegExp('\\[住所1\\]: ' + '.*');
    var Track3 = body.match(regTrack3)[0].replace('[住所1]: ', '').replace('\r', '');
    var regTrack4 = new RegExp('\\[住所2\\]: ' + '.*');
    var Track4 = body.match(regTrack4)[0].replace('[住所2]: ', '').replace('\r', '');
    var regPhone = new RegExp('\\[電話番号\\] : ' + '.*');
    var Phone = body.match(regPhone)[0].replace('[電話番号] : ', '').replace('\r', '');
    var regBirth = new RegExp('\\[生年月日\\] : ' + '.*');
    var Birth = body.match(regBirth)[0].replace('[生年月日] : ', '').replace('\r', '');
    var regMail = new RegExp('\\[メールアドレス\\] : ' + '.*');
    var Mail = body.match(regMail)[0].replace('[メールアドレス] : ', '').replace('\r', '');

    キャンセル

  • 2020/05/25 11:37

    返信ありがとうございます。
    返信いただいたコードで施工してもエラーが発生してしまったためエラー部分を一つずつ削除したところ下記部分を削除したら正しく動作しました。
    下記コードに問題がございましたらお教え願います。


      var regTrack2 = new RegExp('\\[都道府県\\]: ' + '.*');
    var Track2 = body.match(regTrack2)[0].replace('[都道府県]: ', '').replace('\r', '');
    var regTrack3 = new RegExp('\\[住所1\\]: ' + '.*');
    var Track3 = body.match(regTrack3)[0].replace('[住所1]: ', '').replace('\r', '');
    var regTrack4 = new RegExp('\\[住所2\\]: ' + '.*');
    var Track4 = body.match(regTrack4)[0].replace('[住所2]: ', '').replace('\r', '');


    sheet.getRange(row,5).setValue([Track2]);
    sheet.getRange(row,6).setValue([Track3]);
    sheet.getRange(row,7).setValue([Track4]);

    キャンセル

  • 2020/05/25 13:13

    コードを確認したところ「:」部分のスペースが不揃いでそちらを合わせましたら正常に動作しました!
    下記に書き直したコードを記入いたしました。
    この度は誠にありがとうございました!!

    var regTrack2 = new RegExp('\\[都道府県\\] : ' + '.*');
    var Track2 = body.match(regTrack2)[0].replace('[都道府県] : ', '').replace('\r', '');
    var regTrack3 = new RegExp('\\[住所1\\] : ' + '.*');
    var Track3 = body.match(regTrack3)[0].replace('[住所1] : ', '').replace('\r', '');
    var regTrack4 = new RegExp('\\[住所2\\] : ' + '.*');
    var Track4 = body.match(regTrack4)[0].replace('[住所2] : ', '').replace('\r', '');

    キャンセル

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる