Excelで使用できるFILTERXML関数をスプレッドシートでも使用できないか考えた結果、カスタム関数を作ればいいじゃないと思い作成した結果をお伝えします。
Googleのカスタム関数に関してはこちら↓
Google スプレッドシートのカスタム関数 | Apps Script | Google for Developers
ExcelのFILTER関数についてはこちら↓
FILTERXML 関数 - Microsoft サポート
書式: FILTERXML(xml, xpath)
Google Apps ScriptでのXMLデータ処理
Google Apps Scriptを使って、特定のURLからXMLデータを取得する関数、また、ExcelのFILTERXML関数のようなそのデータから必要な情報を取得する関数を作成しました。
getXml関数
指定されたURLからXMLデータを取得し、その内容を文字列として返す関数です。(ExcelのWEBSERVICE関数のようなものです。)
既にXMLデータを取得している場合は不要です。
1 2 3 4 5 6 7 8 9 10 11 |
/** * URLからxmlを取得します GAS/カスタム関数 * * @param {‘https://~’} strUrl 取得したいXMLのURL。 * @return xml形式の文字列。 * @customfunction */ function getXml(strUrl) { const res = UrlFetchApp.fetch(strUrl); return res.getContentText(); } |
以下のような説明文が表示されるように設定したので感覚的に使用することができます。
filterXml関数
XML形式の文字列と取得したい要素のXPathを受け取り、指定された要素の値を抽出して配列として返す関数です。比較的ExcelのFILTERXML関数と近い動きをする処理にできたかなと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/** * xml形式の文字列から指定した要素の値を取得します GAS/カスタム関数 * * @param {‘xml形式の文字列’} strXml 取得元のxml形式文字列。 * @param {‘要素’} xPath 取得したいxmlの要素。/results/hoge * @return 取得した値を配列形式で取得。 * @customfunction */ function filterXml(strXml, xPath = "") { //xmlをパース。 const xmlparse = XmlService.parse(strXml); //Rootを取得。 const root = xmlparse.getRootElement(); //Rootは既に取得しているため、取得したい要素からRootを削除する。 xPath = xPath.replace(`/${root.getName()}/`, ""); var childs = []; //要素をスラッシュごとに分割し階層化。 for (var x of xPath.split("/")) { //第二階層はRootから取得。 if (childs.length == 0) { childs = root.getChildren(x); //第三階層以下は子要素から取得。 } else { var data = []; //子要素の数だけ繰り返し。 for (var child of childs) { var c_childs = child.getChildren(x); //子要素内の子要素の数だけ繰り返し。 for (var c_child of c_childs) { data = data.concat(c_child); } } childs = data; } } //取得した要素から値を取得する。 var vReturn = []; for (var child of childs) { vReturn = vReturn.concat(child.getValue()); } //値が一つもない場合は空白を返す。 if (vReturn.length == 0) { vReturn = ""; } return vReturn; } |
以下のような説明文が表示されるように設定したので感覚的に使用することができます。
このスクリプトを利用することで、Googleスプレッドシートと連携してXMLデータを簡単に取得・解析ができるので、ぜひお試しください!
---コメント---