8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Power PagesにJavaScriptで郵便番号検索を実装してみた。

Last updated at Posted at 2022-06-19

image.png
前回に引き続き、Preview版のPower Pagesをハックしていきます。
今回は、標準の機能では提供されていない、郵便番号検索を実装します。

具体的には、Power PagesがレンダリングしているHTMLのDOMを調べて、そこにJavaScriptで直接ボタンオブジェクトを書き込み、そのボタンが押されたら郵便番号検索APIからデータ取得した住所データを表示するということをやってみたいと思います。

えぇ、、ちょっと自分でも「何言ってるのか、よくわからない」んですよ😁

まずはフィードバックテーブルに列を追加

Power Pagesのサンプルにある「お問い合わせ」ページに使われているテーブル「フィードバック」に「郵便番号」と「住所」を追加します。
image.png

ページのフォームにも追加した列を「フィールドを編集する」ボタンから表示させます。
image.png

「フィールドの追加」から「郵便番号」「住所」を選び「保存」→「フォームの公開」をします。
image.png

そうすると、こんな感じで郵便番号と住所がフォームに表示される筈です。
image.png

編集画面からソースを確認してみる

Power Pagesの編集画面で「お問い合わせページ」の「ソースコード編集ボタン」を押して、フォームが表示されているソース部分を確認すると、この部分は実際にページを公開して表示する際に、プログラムで読み込まれるように記載されています。
image.png

郵便番号検索を実装してみる

Power Pagesは、フォームの部分については、ノーコーディングなので先程のように選んで追加するだけです。
しかも編集画面でもフォーム部分はHTMLソースを編集することができないので、郵便番号検索ボタンは通常は付けられませんが、公開して表示されたページのDOMを調べてJavaScriptを使って指定の場所に書き出せるかテストしてみます。

DOMについて詳しく知りたい方は、下記ページ参照してください。
「DOMとは」

郵便番号検索API

問い合わせフォームでは、郵便番号検索機能がついていると思うのですが、データから自前で作成するとメンテナンスも大変なので、外部サービスとして「zipcloud」のAPIサービスを利用させていただきます。

zipcloud

先程の「郵便番号」に郵便番号を入れて検索したら「住所」に住所が入ってくる想定です。

ブラウザで当該の場所を調べる

Power Pagesで対象となる「お問い合わせページ」をブラウザで表示して「デベロッパーモード」(Cntrl+Shift+I)を呼び出し、フォーム部分のHTMLを調べます。

画面左上の「ソース指定ボタン(正式名称わかりませんw)」を押して、郵便番号入力部分をクリックするとHTMLの当該の部分のソースを教えてくれます。

Power Pagesの郵便番号部分を指定してみると、入力ボックスをTableタグで囲っていることがわかります。
image.png

JavaScriptで指定箇所にボタンを書き出してみる

Power Pagesの編集画面に戻り、お問い合わせページのソース編集画面に、以下のJavaScriptのコードを一番下に貼り付けます。

<script>
  let zipcode = document.querySelector("#EntityFormControl_7afb648fd6dbec11bb3c000d3a40b515_EntityFormView > div.tab.clearfix > div > div > fieldset > table > tbody > tr:nth-child(6) > td.clearfix.cell.text.form-control-cell");
  zipcode.insertAdjacentHTML('beforeend', '<button type="button" id="searchBtn">郵便番号検索</button>');
</script>

1行目:zipecodeという変数にdocument.querySelectorで指定したパスを代入します。
このカッコの中身はtableのtdタグまでのパスが記載されています。
本当はid名があればそのid名を記載すれば取得できますが、Power Pagesのtdタグにはid名が指定されていないので、このように指定しています。

2行目:insertAdjacentHTMLは、指定した場所に要素を追加するのですが、第一引数の「beforeend」で「指定要素の最後に」といった意味になります。第二引数は書き出したいタグを書きます。

指定箇所までのパスの取得方法は、自分で調べると大変なのでブラウザのデベロッパーツールで要素を右クリックして「JSパスをコピー」で取得できます。
image.png

実際のブラウザで確認してみる

編集画面右上の「同期」ボタンと「プレビュー」ボタンを押すと、、、、
こんな感じでボタンが書き出されているのが確認できました。
image.png

郵便番号検索の実装

これまでの要素へのアクセスをまとめてJavaScriptで実装します。

以下参考にしています。
Adobe-Marketing-Cloud/fetch-jsonp
郵便番号検索APIで住所検索を実装する

APIへのアクセスには「fetch-jsonp」を利用しています。こちらをCDNから読み込みます。

<script src="https://cdn.jsdelivr.net/npm/fetch-jsonp@1.1.3/build/fetch-jsonp.min.js"></script>

1行目から4行目:表示させたいボタンやエラーの際に文字を表示する場所を書き出しています。
5行目以降:出力したボタンの位置を取得して、addEventListenerでボタンクリックを取得します。
クリックされたら、zipcloudへ送るURLを、入力された郵便番号を文字列として生成し、fetch-jsonpで送信してあげます。
data.resultsとして、配列で戻ってきますので、取り出した都道府県や住所の文字列を連結して、住所のinputに返してあげます。

<script>
  let zipcode = document.querySelector("#EntityFormControl_7afb648fd6dbec11bb3c000d3a40b515_EntityFormView > div.tab.clearfix > div > div > fieldset > table > tbody > tr:nth-child(6) > td.clearfix.cell.text.form-control-cell");
  zipcode.insertAdjacentHTML('beforeend', '<button type="button" id="searchBtn">郵便番号検索</button>');
  zipcode.insertAdjacentHTML('beforeend', '<span id="error"></span>');


  let search = document.querySelector("#searchBtn");
  search.addEventListener('click', () => {
    let api = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=';
    let error = document.getElementById('error');
    let input = document.getElementById('cr131_zipcode');
    let address = document.getElementById('cr131_address');
    let param = input.value.replace("-", ""); 
    let url = api + param;
    fetchJsonp(url, {
        timeout: 10000, 
      })
      .then((response) => {
        error.textContent = ''; 
        return response.json();
      })
      .then((data) => {
        if (data.status === 400) { 
          error.textContent = data.message;
        } else if (data.results === null) {
          error.textContent = '郵便番号から住所が見つかりませんでした。';
        } else {
          address.value = data.results[0].address1 + data.results[0].address2 + data.results[0].address3;
        }
      })
      .catch((ex) => { //例外処理
        console.log(ex);
      });
  }, false);
</script>

テストしてみる

郵便番号を入力して、「郵便番号検索」ボタンを押すと、、、
住所部分に取得した住所の文字列が並んでいるのがわかります。
登録ボタンを押すとDataverseにデータが保存されます。
image.png

Power Pagesのトップページにリストを作成して、データベースの一覧を表示してみると、郵便番号と住所が登録されていることが確認できました。
image.png

JavaScriptからコントロール出来ると、コネクタを使うようにPower Pagesで色々なデータを取得してくることが可能になり、拡張性が増えました。

次回はGoogle Mapで現在地を取得して、地図にマッピングとかやってみたいと思います。

8
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?