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

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

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

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

HeartRails

HeartRails(HeartRails Capture)は、サイトのサムネイル画像簡単に作ることができるツールです。Webページ・PDF ファイル・Office ファイルのサムネイル画像を作成することができます。

Q&A

解決済

2回答

1579閲覧

GASでAPIを使い、xmlの情報を取得しようとしています。文字化けが起きます。

ymgc01

総合スコア13

Google Apps Script

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

HeartRails

HeartRails(HeartRails Capture)は、サイトのサムネイル画像簡単に作ることができるツールです。Webページ・PDF ファイル・Office ファイルのサムネイル画像を作成することができます。

0グッド

0クリップ

投稿2019/06/12 13:59

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}

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

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

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

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

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

guest

回答2

0

ベストアンサー

そのページ拝見したんですけどjsonでも提供してるじゃないですか?
でjsonだと

json

1{"response":{"station":[{"name":"\u531712\u6761","kana":"\u304d\u305f\u3058\u3085\u3046\u306b\u3058\u3087\u3046","line":"\u672d\u5e4c\u5e02\u5357\u5317\u7dda","y":43.074829,"x":141.348403,"postal":"0010012","prev":"\u531718\u6761","next":"\u3055\u3063\u307d\u308d","prefecture":"\u5317\u6d77\u9053","distance":244.01302822313875}]}}

こうなんです。

ちゃんとコードを追いかけてないんであれですが、もし用途がシートに書くことだったら、この表現はこのまま書くとシート側で普通の漢字ひらがなに戻ります

javascript

1function q194655() { 2 SpreadsheetApp.getActiveSheet().getRange("A1").setValue("\u531712\u6761"); 3}

これでA1に「北12条」と入りました。

つまりAPIをjsonにすれば何もしなくていい、のではないかという回答です

投稿2019/06/13 04:31

papinianus

総合スコア12705

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

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

0

こちらの記事を参考にするのはどうでしょうか。
実体参照になっているので、それを文字変換します。

投稿2019/06/12 18:10

tail12

総合スコア607

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問