株式会社スマレジの開発部でスマレジのサーバサイドを作っています

スマレジプラットフォームAPIをGASで実行する

こんにちは!株式会社スマレジ、開発部のmasaです!

お盆シーズンですが、コロナのせいで帰省しづらいし、どう過ごそうかな・・・と考える今日この頃ですが、 皆様はどうお過ごしでしょうか?

今日は、前回の続きで正式版のプラットフォームAPIでアプリを実行してみようと思います。

取引一覧取得APIを実行する

ソースコード

import Spreadsheet = GoogleAppsScript.Spreadsheet;

export class TransactionService {
    static execute(spreadsheet: Spreadsheet.Spreadsheet) {
        const contractId = PropertiesService.getScriptProperties().getProperty("SMAREGI_CONTRACT_ID_DEVELOPMENT");
        const accessToken = PropertiesService.getScriptProperties().getProperty("SMAREGI_APP_ACCESS_TOKEN");
        let url = 'https://api.smaregi.dev/' + contractId + '/pos/transactions?';
        const headers = {
            'Authorization' : 'Bearer ' + accessToken
        };

        interface GetRequest {
            from: string;
            to: string;
        }

        const getParams: GetRequest = {
            from : TransactionService.getDate("from"),
            to : TransactionService.getDate("to")
        };

        url += 'transaction_date_time-from' + '=' + getParams.from + "&";
        url += 'transaction_date_time-to' + '=' + getParams.to;

        url = encodeURI(url);

        // urlfetchappのオプション情報
        const options: any = {
            'method' : 'get',
            'headers' : headers     // header情報を追加
        };

        try {
            //外部へアクセスさせる
            let resStr = UrlFetchApp.fetch(url, options).getContentText();
            if (resStr.length === 0) {
                throw new Error("受信データがありませんでした。");
            }
            let resJson = JSON.parse(resStr);
            Logger.log(resStr);
        } catch(e) {
            Logger.log("エラー:" + e);
            throw new Error(e);
        }
    }

    /**
     * 時刻を取得
     * @param division fromなら現在時刻の1時間前、toなら現在時刻を取得(分と秒は00)
     * @return string yyyy-mm-dd hh:00:00
     */
    static getDate (division: string) {
        let date = new Date();
        let format = "YYYY-MM-ddTHH:mm:ss+09:00";
        let hour = date.getUTCHours();
        if (division === "from") {
            hour--;
        } else if (division !== "to") {
            throw new Error("fromかtoを指定してください");
        }

        format = format.replace(/YYYY/g, "" + date.getFullYear());
        format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
        format = format.replace(/dd/g, ('0' + date.getDate()).slice(-2));
        format = format.replace(/HH/g, ('0' + hour).slice(-2));
        format = format.replace(/mm/g, ('00'));
        format = format.replace(/ss/g, ('00'));
        // : -> %3A
        format = format.replace(/:/g, ('%3A'));
        format = format.replace(/\+/g, ('%2B'));
        return format;
    };
}

※ ローカル開発のため、webpackを使っています。

やっていること

前回のブログで取得したアクセストークンと契約IDを呼び出し、 UrlFetchApp.fetch(url, options).getContentText();でリクエストを取得しています。

masa2019.hatenablog.com

売り上げ通知アプリの仕様に基づいて、今は実行された時間の1時間前(11時台に実行されたら、10時から11時)の取引を全て取ってくるようにしてあります。 今回はログに出力していますが、次回はこれをセルに出力し、見た目を整えていきます。 (ほとんどの人はこのソースがあれば事足りるかなと思い、取り急ぎで記載しました)

もし実行して、頓珍漢な時間の取り引きが取れる場合は、タイムゾーンの設定を見直してください。

qiita.com

こちらの記事が参考になりました! (特にclaspで開発している人は要注意!appscript.jsonのデフォルトがアメリカ仕様になっているため!)