見出し画像

Chromebookで作るPWAアプリ日記9

こんにちは、junkawaです。

バーコード画像を読み取り、商品名を取得するアプリの製作中です。

1. ブラウザでバーコード画像を読み取りJANコードに変換する(前回紹介)
2. ブラウザからGAS(Google Apps Script)へ商品名をもらいにいく
3. GASからYahooへ商品名をもらいにいく(前回紹介)

2. ブラウザからGAS(Google Apps Script)へ商品名をもらいにいく

ブラウザ側

const sendRequest = (searchJan) => {
    $.ajax({
        type: 'GET',
        url: 'https://script.google.com/macros/s/.../exec',
        data: {
            jan: searchJan,
        },
        dataType: 'jsonp',
        jsonp: 'callback',
        crossDomain: true,
    }).done( (data) => {
        console.log(data);
    }).fail( (data) => {
    });
};

(() => {
    sendRequest('4959127006128');
})();

はじめに、jsonpcallbackでコールバック関数を指定したのですが、上手く実行されませんでした。

GASからはコールバック関数名が入ったコードを取得できていたので、そこは問題ないはずです。index.html内にjsonpcallbackを指定したコードを書くと上手く実行されました。

webpackが関係している問題と思われます。jsonpcallbackで指定するのはメソッド名を文字列にしたものです。試していませんが、ここを関数名を入れた変数にすれば上手くいきそうな気がします。

結局、深追いするのはやめて、上記のようにコールバック処理をdone()に書くことで対応しました。

追記

本家ドキュメントでも、下記のようにjsonpCallbackを使わないほうがよいと書いてあるので、使わないようにします。

It is preferable to let jQuery generate a unique name as it'll make it easier to manage the requests and provide callbacks and error handling.

jQueryがランダムに生成したコールバックって、ユーザが使えるのか?

ランダムに生成したコールバックから done/fail が呼ばれているのか?

jsonpCallbackを指定した場合、done/fail はだれがいつ呼ぶのか?

謎は尽きない。

サーバ(GAS)側

function doGet(e) {
  const params = JSON.parse(JSON.stringify(e));
  if (!('jan' in params.parameter)) return HtmlService.createHtmlOutput('invalid params');
  const jan = params.parameter.jan;

  // Yahooから商品情報を取得する処理
  const keywords = getKeywordsFromYahoo_(jan);
    
  var content = '';
  const keywordsJson = JSON.stringify(keywords);
  if ('callback' in params.parameter) {
    content = params.parameter.callback + '(' + keywordsJson + ')';
  } else {
    content = keywordsJson;
  }
  const res = ContentService.createTextOutput(content).setMimeType(ContentService.MimeType.JAVASCRIPT);
  return res;
}

最初に、GETのパラメータにjanがあるかどうかを確認しています。

次に、Yahooから商品情報を取得しています。

最後に、JSONP対応のために、コンテンツを"コールバック関数名(返すJSONデータ)"としています。

今後の予定

これで、バーコードを読み取り、商品名のキーワードを取得するところまで実装できました。

このような感じに、検索するための商品キーワードを選択可能にして、各種ECサイトで検索できるようにする予定です。

ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。