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

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

ただいまの
回答率

90.45%

  • JavaScript

    21057questions

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

  • API

    1862questions

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

  • Google Apps Script

    1348questions

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

  • HeartRails

    1questions

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

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

受付中

回答 2

投稿

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

ymgc01

score 2

google app scriptを使って、Gメール本文に書かれているURLを参照し、その中から郵便番号を調べ最寄り駅を吐き出すマクロを作っておりました。
最寄り駅の検索には https://geoapi.heartrails.com/api.html のサービスを使っています。
http://geoapi.heartrails.com/api/xml?method=getStations&postal=OOOOOOO で検索する分にはちゃんとに日本語で情報が表示されるのですが、

UrlFetchApp.fetch(url).getContentText("UTF-8");


を使うと、数値参照?の結果が表示されてしまいます。
<name>&#28023;&#32769;&#21517;</name>←こんな感じです。

これを日本語にするためにはどうすればよいでしょうか...
「js 文字化け xml api 日本語 」といったワードでの検索はしたつもりです...

今回は上記問題でつっかえていますが、それ以上にひどいコードを描いていると思います。
見過ごせない部分ございましたらご教示いただけますと幸いでございます...。
何卒よろしくお願いいたします。

/**
 * ラベルが付いた未読のメール(スレッド)を探して返す
 * @return GmailThread[]
 */
function getMail() {
  var label = "本アップ";
  var start = 0;
  var max = 500;
  return GmailApp.search('label:' + label + ' is:unread', start, max);
} 

/**
 * メール本文を整形してスプレッドシートに保存するためのオブジェクトを返す
 * @return Object
 */
function getDatabyMailBody( body ) {
  // <br>タグがあったら改行コードに変換する
  var str = body.replace(/<br(\s+\/)?>/g, "\n");
  /* 適時必要な形式に正規表現などで変換してください */
  var id = str.match(/id: ([0-9]+)/g);
  var code = str.match(/errorcode: .*[^\n]/g);

  return {
    id: id,
    code: code
  };
}


//getElementsByTagName的な奴
function getContentOfTagName(html, tagName) {

  var i = 0;
  var j = 0;
  var startOfTag;
  var endOfTag;
  var str = [ ];

  while(html.indexOf('<' + tagName,j)!=-1){

    //"<タグ名"の開始位置を取得
    j = html.indexOf('<' + tagName,j);

    //次の">"位置 + 1を文字列の始めとする
    startOfStr = html.indexOf('>',j)+1;

    //次の"</タグ名>"位置を文字列の終わりとする
    endOfStr = html.indexOf('</' + tagName + '>',j);

    //タグの間の文字列を配列に追加
    str[i] = html.substring(startOfStr, endOfStr);

    j = endOfStr + 1;
    i++;
  }

  return str;
}


/**
 * gmailを取得してスプレッドシートに保存する
 */
function onSaveMailToSheet() {
  // データを保存するシートの名前
  var sheetName = '本アップ一覧';
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---------------------/edit").getSheetByName( sheetName );
  var row = ss.getLastRow() + 1;
  var threads = getMail();

  for( var i in threads ) {
    var thread = threads[i];
    var msgs = thread.getMessages();
    // スレッド内のメールをそれぞれチェックする
    for( var j in msgs ) {
      var msg = msgs[j];
      // スレッド内の未読メッセージのみを処理
      if( msg.isUnread() ) {
//        var itemRegexp = new RegExp(/<a href=".*?">/);
//        var item = msg.getBody().match(itemRegexp).replace('<a href=','');
        var date = msg.getDate();
        var body = msg.getBody();
//        var doc = XmlService.parse(body);
//        var xml = doc.getRootElement();
//        var url = parser.getElementByTagName(xml,"a")
        var subject= msg.getSubject().replace("ラベル","");
        var url = getContentOfTagName(body, "a")
        Logger.log(url[0]);

//URLから郵便番号の取得
        // アクセス先
        // GETリクエスト
        try{
        // 処理1
          var response = UrlFetchApp.fetch(url[0]);
          // HTMLの結果を取得(引数のcharsetは設定したほうが良い)
          var content = response.getContentText("UTF-8");
          var regex = new RegExp(/\b〒\d{3}-?\d{4}$/);
          try{
            var postal = content.match(/.〒\d{3}-\d{4}/);
            var postal2 = postal.toString().replace('>','').replace('-','').replace('〒','');
            var geoInformation = UrlFetchApp.fetch("http://geoapi.heartrails.com/api/xml?method=getStations&postal="+postal2).getContentText("UTF-8");
            Logger.log(geoInformation);
          }catch(e){
              var postal = e,
              geoInformation = "郵便番号見つからへんかった";
          }       
        }catch(e){
        // 処理2
          var postal = "URLなんか違くね?",
              geoInformation = "違うから郵便番号も取ってこれなかったよ。";
        }

        var values = [
          [date,subject ,url,postal,geoInformation]
        ];
        // シートに保存
        // ※ 3コラムなので A:C のRangeを取る。データ数に合わせて変更が必要
        ss.getRange("A" + row +":E" + row).setValues(values);
        row++;
      }
    }
    // スレッドを既読にする
    thread.markRead();
    Utilities.sleep(10000);
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

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

{"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}]}}


こうなんです。

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

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


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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

同じタグがついた質問を見る

  • JavaScript

    21057questions

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

  • API

    1862questions

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

  • Google Apps Script

    1348questions

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

  • HeartRails

    1questions

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