Google Apps Scriptでプライベート関数を宣言し、「実行する関数を選択」に表示させない

Google Apps Scriptで宣言した関数が、「実行する関数を選択」に一覧表示される。

privateとして扱いたい関数については非表示にしたいと思い、調べたのでメモ。

試行錯誤

何パターンか試してみたが、関数宣言(function 関数名...)、関数式(const 関数名 = function...)、ラムダ式のいずれも、グローバルに記述した場合は選択欄に表示される。

クラスにメソッドとして定義したり、IIFEで関数を返すと、表示されなくなった。

また、関数名の指定の仕方で何とかならないかと思い、関数名に記号をつけたりしてみたところ、関数名の末尾にアンダースコアをつけた場合も表示されなくなった。

非表示になるパターン

関数名の末尾にアンダースコア

これが一番簡単。

最初はPythonのように、関数名の先頭にアンダースコア2つをつけたりしたが効果なし。

そういえば、Google JavaScript Style Guideでは、privateなフィールドメソッドの末尾はアンダースコアにするんだったなと思い、試してみたらうまくいった。

Google Apps Scriptのベストプラクティスにも記載あり

関数宣言、関数式、ラムダ式、いずれの場合も有効だった。

// 関数宣言
function hiddenFunc1_() {}

// 関数式
const hiddenFunc2_ = function() {};

// ラムダ式
const hiddenFunc3_ = () => {};

また、この方法で宣言した関数は、サーバー側の関数呼び出しの対象外ともなる模様。

developers.google.com

クラスにメソッドとして定義

グローバル関数が選択肢として表示されるようなので、メソッドにしてやれば表示されない。

2022/4現在、Google Apps Scriptでもclassキーワードによるクラス宣言が使えるので、メソッドにするのは簡単。

適当なオブジェクトを用意して、そこにメソッドを追加しても非表示になりそうだが、未確認。

IIFEで関数を返す

エンクロージャ的に、関数を返す即実行関数だと、認識されない模様。

const hiddenFunc = (() => {
  return () => {};
})();

一応できることはできるが、末尾アンダースコアがあるので使わないか。

振り返り

何年か前にも試していて、できることは覚えていたが、どうやればいいかすっかり忘れていたのでメモしておく。

claspは使わず、久しぶりにGASを書いたが、クラス宣言が使えて結構感動した。