google app scriptを使って、Gメール本文に書かれているURLを参照し、その中から郵便番号を調べ最寄り駅を吐き出すマクロを作っておりました。
最寄り駅の検索には https://geoapi.heartrails.com/api.html のサービスを使っています。
http://geoapi.heartrails.com/api/xml?method=getStations&postal=OOOOOOO で検索する分にはちゃんとに日本語で情報が表示されるのですが、
GAS
1UrlFetchApp.fetch(url).getContentText("UTF-8"); 2
を使うと、数値参照?の結果が表示されてしまいます。
<name>海老名</name>←こんな感じです。
これを日本語にするためにはどうすればよいでしょうか...
「js 文字化け xml api 日本語 」といったワードでの検索はしたつもりです...
今回は上記問題でつっかえていますが、それ以上にひどいコードを描いていると思います。
見過ごせない部分ございましたらご教示いただけますと幸いでございます...。
何卒よろしくお願いいたします。
GAS
1/** 2 * ラベルが付いた未読のメール(スレッド)を探して返す 3 * @return GmailThread[] 4 */ 5function getMail() { 6 var label = "本アップ"; 7 var start = 0; 8 var max = 500; 9 return GmailApp.search('label:' + label + ' is:unread', start, max); 10} 11 12/** 13 * メール本文を整形してスプレッドシートに保存するためのオブジェクトを返す 14 * @return Object 15 */ 16function getDatabyMailBody( body ) { 17 // <br>タグがあったら改行コードに変換する 18 var str = body.replace(/<br(\s+/)?>/g, "\n"); 19 /* 適時必要な形式に正規表現などで変換してください */ 20 var id = str.match(/id: ([0-9]+)/g); 21 var code = str.match(/errorcode: .*[^\n]/g); 22 23 return { 24 id: id, 25 code: code 26 }; 27} 28 29 30//getElementsByTagName的な奴 31function getContentOfTagName(html, tagName) { 32 33 var i = 0; 34 var j = 0; 35 var startOfTag; 36 var endOfTag; 37 var str = [ ]; 38 39 while(html.indexOf('<' + tagName,j)!=-1){ 40 41 //"<タグ名"の開始位置を取得 42 j = html.indexOf('<' + tagName,j); 43 44 //次の">"位置 + 1を文字列の始めとする 45 startOfStr = html.indexOf('>',j)+1; 46 47 //次の"</タグ名>"位置を文字列の終わりとする 48 endOfStr = html.indexOf('</' + tagName + '>',j); 49 50 //タグの間の文字列を配列に追加 51 str[i] = html.substring(startOfStr, endOfStr); 52 53 j = endOfStr + 1; 54 i++; 55 } 56 57 return str; 58} 59 60 61/** 62 * gmailを取得してスプレッドシートに保存する 63 */ 64function onSaveMailToSheet() { 65 // データを保存するシートの名前 66 var sheetName = '本アップ一覧'; 67 var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---------------------/edit").getSheetByName( sheetName ); 68 var row = ss.getLastRow() + 1; 69 var threads = getMail(); 70 71 for( var i in threads ) { 72 var thread = threads[i]; 73 var msgs = thread.getMessages(); 74 // スレッド内のメールをそれぞれチェックする 75 for( var j in msgs ) { 76 var msg = msgs[j]; 77 // スレッド内の未読メッセージのみを処理 78 if( msg.isUnread() ) { 79// var itemRegexp = new RegExp(/<a href=".*?">/); 80// var item = msg.getBody().match(itemRegexp).replace('<a href=',''); 81 var date = msg.getDate(); 82 var body = msg.getBody(); 83// var doc = XmlService.parse(body); 84// var xml = doc.getRootElement(); 85// var url = parser.getElementByTagName(xml,"a") 86 var subject= msg.getSubject().replace("ラベル",""); 87 var url = getContentOfTagName(body, "a") 88 Logger.log(url[0]); 89 90//URLから郵便番号の取得 91 // アクセス先 92 // GETリクエスト 93 try{ 94 // 処理1 95 var response = UrlFetchApp.fetch(url[0]); 96 // HTMLの結果を取得(引数のcharsetは設定したほうが良い) 97 var content = response.getContentText("UTF-8"); 98 var regex = new RegExp(/\b〒\d{3}-?\d{4}$/); 99 try{ 100 var postal = content.match(/.〒\d{3}-\d{4}/); 101 var postal2 = postal.toString().replace('>','').replace('-','').replace('〒',''); 102 var geoInformation = UrlFetchApp.fetch("http://geoapi.heartrails.com/api/xml?method=getStations&postal="+postal2).getContentText("UTF-8"); 103 Logger.log(geoInformation); 104 }catch(e){ 105 var postal = e, 106 geoInformation = "郵便番号見つからへんかった"; 107 } 108 }catch(e){ 109 // 処理2 110 var postal = "URLなんか違くね?", 111 geoInformation = "違うから郵便番号も取ってこれなかったよ。"; 112 } 113 114 var values = [ 115 [date,subject ,url,postal,geoInformation] 116 ]; 117 // シートに保存 118 // ※ 3コラムなので A:C のRangeを取る。データ数に合わせて変更が必要 119 ss.getRange("A" + row +":E" + row).setValues(values); 120 row++; 121 } 122 } 123 // スレッドを既読にする 124 thread.markRead(); 125 Utilities.sleep(10000); 126 } 127}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。