Google Document がめちゃくちゃ賢い!
Google スプレッドシートでスクリプトを組んでみたところ、非常に賢いと感じました。
- デバッグは遅いけれどステップ実行が可能
- インテリセンスが優秀
- エディタ機能が結構利いてる(自動インデントとか)
- 何よりも
糞VBAではなくjavascriptベースで書ける
今回作ってみた関数は以下の物
データは1列で表現したいけれど、スプレッドシートの見せ方は列を分けたいという考えで作成した関数。
Google Scriptの呼び出し元情報で列番号が取れれば引数1つ取ることは可能。
/** * テキスト階層表示 */ function sfac(text,pos) { if (typeof text != "string") { return ""; } var faccount = function (i) { if(text.charAt(i) == "+") { return faccount(++i) } else { return i; } } var pcount = faccount(0); if(pcount == (pos - 1)) { return text.substring(pcount); } return ""; }
Project Eulerをやっていたおかげで、上記のネスト関数 faccount みたいなコードをぱっと思いつきました。
ただjavascriptなどの言語には向いていない関数だと思われます。
(スタックオーバーフローになりやすい)
[追加]
とんだ勘違い。列番号取得しても基点が分からないので意味がないという!
列番号は以下のコードで取得できました。
SpreadsheetApp.getActiveRange().getColumn()
最終的なコードの全体
function sfac(text,pos) { if (typeof text != "string") { return ""; } var faccount = function (i) { if(text[i] == "+") { return faccount(++i) } else { return i; } } var pcount = faccount(0); if(pcount == pos - 1) return text.substring(pcount); return ""; }
[追記2]
最終的には、関数の呼び出し元の列の2行目の値から1文字目を数字と断定して取得し、その数字と+の数を判定する関数にした。
/** * テキスト階層表示 */ function sfac(text) { if (typeof text != "string") { return ""; } var sheet = SpreadsheetApp.getActiveSheet(); var row = 2; var col = sheet.getActiveCell().getColumn(); var pos = parseInt(String(sheet.getRange(row, col).getValue())[0]); var faccount = function (i) { if(text[i] == "+") { return faccount(++i) } else { return i; } } var pcount = faccount(0); if(pcount == pos - 1) return text.substring(pcount); return ""; }