背景と概要
この記事ではGoogle Apps Script(GAS)を作成しているプロジェクトからコメントを除去しつつ整形したスクリプトを取得するための方法について紹介させていただきます。
GASでスクリプトを作成していると、スクリプトのフォーマットに誤りがあれば保存時にそれをエラーメッセージとして指摘されることはご存知のことと思います。これはスクリプトエディタあるいはGoogle Driveでフォーマットを管理しているのではないかと考えていました。そしてこの機能を何らかの方法で利用することができればスクリプトの整形もできるのではないかと期待していました。最近、面白いことに気付きました。例えば、Google Drive上に新しいプロジェクトを作成(スタンドアロン、バウンドスクリプトどちらでも可)し、そのコード.gsへ下記スクリプトをコピーペーストします。
function myFunction() {
Logger.log(this);
}
これを実行すると、this
の中にプロジェクト内のスクリプトが含まれていることに気付きました。さらにいろいろなプロジェクトでこれを実行してみると、取得されるスクリプトは微妙にスクリプトエディタ上のものとは異なっているように思われました。よく見てみると、コメント文が除去され、さらに整形までされていることが分かりました。Apps Script APIでスクリプトを取得すると、スクリプトエディタ上のそのままの状態が取得されますが、この方法では特にAPIを使用せずにコメントの無い整形されたスクリプトを取得することができます。これは、例えば不要なコメントを削除したり、インデントを修正してスクリプトを見せる場合や、ウェブ上のスクリプトを整形して見やすくする場合などに利用できるのではないかと考えられます。
制限
- GASプロジェクトの中の".gs"ファイルでしか使用できません。HTMLやjsonファイルは取得できません。
- プロジェクト内に同一の関数名があればどちらか一方しか取得できません。
- 関数の外側にあるような例えばグローバル変数は取得できませんでした。
面白いと思ったのですが、使用時にはこれらの点に注意する必要があります。
使い方
スクリプトを取得するシンプルなサンプルは次の通りです。値自体はオブジェクトになっていますので、必要に応じて作成することができるかと思います。このサンプルを使用する際は、プロジェクト内の.gsファイルへ下記スクリプトをコピーペーストしてから実行します。スクリプトが実行すると、"reformattedScripts.txt"のファイルがルートに作成され、その中にコメントが除去され整形されたスクリプトが保存されます。
function getScripts() {
var scripts = Object.keys(this).map(function(e){return typeof this[e] == "function" && e != "getScripts" ? this[e] : ""}).filter(String).reverse();
DriveApp.createFile("reformattedScripts.txt", scripts.join(""), MimeType.PLAIN_TEXT);
}
結果
サンプルとして、次のようなスクリプトがコード.gsファイル内にあるとして、getScripts()
を実行します。すると、getScripts()
以外のファンクションのスクリプトが取得され、ファイルに保存されます。
function getScripts() {
var scripts = Object.keys(this).map(function(e){return typeof this[e] == "function" && e != "getScripts" ? this[e] : ""}).filter(String).reverse();
DriveApp.createFile("reformattedScripts.txt", scripts.join(""), MimeType.PLAIN_TEXT);
}
function myFunction1() {
// sample comment 1
}
function myFunction2() {
Logger.log("sample") // sample comment 2
}
// sample comment 3
function myFunction3() {for(var i=0;i<10;i++){for(var j=0;j<10;j++){Logger.log(i+j)}}}
保存されたファイル内のスクリプトは次の通りです。コメントが除去されて整形されていることが分かります。
function myFunction1() {
}
function myFunction2() {
Logger.log("sample");
}
function myFunction3() {
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
Logger.log(i + j);
}
}
}
本記事の情報が既知の場合は申し訳ありません。