Google Document がめちゃくちゃ賢い!

Google スプレッドシートスクリプトを組んでみたところ、非常に賢いと感じました。

  1. デバッグは遅いけれどステップ実行が可能
  2. インテリセンスが優秀
  3. エディタ機能が結構利いてる(自動インデントとか)
  4. 何よりも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 "";
}