【コピペ化】GASのコードを見れないようにする方法・秘匿化を実際にやってみた!

Google Apps Scriptはとても便利なプログラム言語ですが、スプレットシートに紐づいているGASは誰でも閲覧することができ、開発者はソースコードを守りたかったとしても、その利便性ゆえに、ソースコードを秘匿することは困難です。

つまり、第三者がそのソースコードを意図的に、容易にコピーすることが可能です。

ソースコード自体を提供したくない場合に何か手段がないか考えた結果、良い解決策を見つけたため、この記事ではその方法をご共有いたします。

目次

大まかな全体像のご説明

実装の全体的な大まかな仕組みは上記のような流れになります。

右側の「本処理を行っているGoogle Apps Script」のファイルを渡さない限り、ソースコードを覗かれる心配はありません。

それでは、実装の全体的な大まかな流れについて説明します。

1. スプシに紐づいているGASから、本処理を行っているGASをAPIでUrlFetchApp.fetchする。

スプレットシートに紐づいているGASはどうしても閲覧することができます。

余談ですが、仮にこのスプレットシートに紐づいているGASのコード自体に認証機能を実装したとしても、悪意のあるユーザーによって、その認証機能自体を削除することも可能ですし、このスプレットシート自体をコピペして流用することも可能になります。

そのため、このスプレットシートに紐づいているGASは閲覧できるものとして処理せざるを得ません。

そこでこのスプレットシートは、本処理を行っているGASをコールする機能だけをもたせるものにします。

これであれば、悪意のあるユーザーがスプレットシートに紐づいているコードを閲覧したとしても本処理内容を確認することはできません。

2. 本処理を行っているGASを、WEBアプリとしてデプロイしておく。

(※本来をこの処理を1の前に行うべきなのですが、理解しやすいようにあえて順番を前後しています。)

本処理を行っているGAS自体をWEBページアプリとして外部にデプロイし、リリースします。これでこのAPIを叩けば、外部からも本処理を行うことが可能になります。

ですが、これだけでは外部の環境から誰だってAPIを叩くことができます。そのため、認証要素としてkeyを設置します。これで、URLとkey両方を持っていないと処理を享受できない環境が整いました。

具体的なやり方の説明(図解付き)

Step1: 本処理を行うGAS

①Googleで「script.google.com」と検索する。

②「新しいプロジェクト」を押下する。

③以下のコードを、コピペします。

/**
 * メイン処理
 */
function doGet(e) {
  // シークレットキーを設定する
  const secretKey = "secretKey";                 //ここに任意の文字列を設置する。
  const key = e.parameter.key;

  // シークレットキーが一致したら処理を実行する。
  if (secretKey === key) {                       // テストしたいときは、secretKey === key の部分をtrueに変更する。
    // スプレッドシートと各シートを取得  
    const ssid = "対象となるスプレットシートのid";   //https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxx/edit?gid=1552300535
    const ss = SpreadsheetApp.openById(ssid);

    //////////////////////////////////////////
    // ↓↓↓ここから下に、実行したい処理を記入↓↓↓ //
    //////////////////////////////////////////



    console.log("a");


    /////////////////////
    // ↑↑↑ここまで↑↑↑ //
    /////////////////////
  }
}

④本処理のコードを、該当箇所に記入します。

⑤WEBアプリとしてデプロイする。

⑤-1 左上にある、デプロイから「新しいデプロイ」を押下する。

⑤-2 歯車を押し「ウェブアプリ」を押下する。

⑤-3 「デプロイ」を押下する。必要があれば説明文も記入すると管理がしやすいです。

⑤-4 「アクセスを承認」を押下する。

⑤-5 任意のアカウントを選択する。

⑤-6 スクロールし、「Allow」を押下する。

⑤-7 APIのURLが発行されるので、コピーしてメモしておく。(このURLが後ほど必要になるのでわかりやすい場所にメモしてください。)

これでStep1は完了!

Step2: スプシに紐づいているGASから、本処理GASのAPIをコールする。

⑥任意のスプシを開き、Apps Scriptを開く。

⑦ 以下のコードを、コピペする。

function execGas() {
  const key = "secretKey";    //ここに設定したシークレットキーの文字列を設置する。
  const apiUrl = `https://script.google.com/xxxxxx/x/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec?key=${key}`;
  UrlFetchApp.fetch(apiUrl);
}

これでStep2も完了!

execGas関数を起動すれば、シークレットキーとともにapiをコールします。このシークレットキーが正しければ問題なく、「本処理を行っているGAS」の処理が実装されるので、スプシ自体で処理は実装されるが、どのようなソースコードが走って処理が行っているのかはブラックボックス化することが可能になりました。

本処理のコードの内容を変えた場合はデプロイし直す必要がある

デプロイしたURLはあくまで、そのデプロイしたタイミングでのソースコードになります。

コードを修正した場合は、上記のやり方で再度デプロイし直す必要があり、デプロイする度にURLは変更されるので、スプレットシートに紐づいたgasのURLも変更する必要があるので、注意が必要です。

一時的にGASを動かなくしたい場合の対応方法

何かしらの理由で、GASを動かなくしたい(APIをコールしても処理が走らないようにする)場合は、デプロイした内容をアーカイブする必要があります。

やり方は以下の通りです。

①「デプロイを管理」を押す。

②対象のデプロイを選択し、アーカイブを押す。

③「アーカイブ」を押下。

目次