初めてのAzureFunctions作成してみた (JSON Arrayのソート)


はじめに

個人の記録的な投稿であることをご容赦ください。
Power Automateを利用していると、配列のソート操作がないことにしばしば悩まされます。
簡易的なソートであればPower Automateの枠内で対応できますが、ちゃんとした(?)ソートではないので、制限が多いです。
そんなちょっとした不満を解消する手段として、Azure Functionsを使ってみたので、その記録です。

つくる/つくった

参考にしたのは公式のHello worldです。
(Ref. https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function )
得意な言語というのも特にないので、javascriptで始めました。

今回作るものは、
1. JSONの配列、プロパティ名を入力として
2. 対象のプロパティでソートされた配列を返す
というだけのシンプルなものです。
なお、ちょっとした都合により、JSON配列はURLにパラメータとして含めることで受け渡しています。
普通にやるならリクエストのBodyに入れるんでしょう。

想定するのは以下のようなGETのリクエストです。

https://abcdefg.azurewebsites.net/api/HttpExample?src=<JSON配列のURL encodeした値>&prop=<ソートしたいプロパティ>

できたFunctionsはindex.jsを少しだけHello Worldから変更しただけのものです。

index.js
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    function sortByProperty(property) {
        return function (a, b) {
            if (a[property] > b[property])
                return 1;
            else if (a[property] < b[property])
                return -1;

            return 0;
        }
    }

    if (req.query.src && req.query.prop) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: JSON.parse(decodeURI(req.query.src)).sort(sortByProperty(req.query.prop)),
            headers: {
                'Content-Type': 'application/json'
            }
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

sortByPropertyでリクエストのパラメータにあるpropを参照します。ソートする対象は、エンコードされているので、まずdecodeURIで文字列に戻して、さらにJSONとして扱うためにJSON.parseしました。

おわり, 動かした結果

unsorted がもとの入力になります。(画像右側)
これを、HTTPアクション (Azure Functionsよびだし) を通すことで、"name"でソートされた結果を得ることができました。

このような感じで、サービスに備わっていない機能を少しだけ、とても簡単なコードで補完できるのはとても良いですね。
次はバインディングを利用して、OneDriveやSharePointに保存されたファイルへのアクセスを試してみたいと思います。