1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASのウェブアプリで大量のシートのデータ送信を一括管理したい ~ウェブアプリとライブラリの使い分け~

1
Last updated at Posted at 2025-12-25

先日、業務中一つのアプリをGASで作成して、GASのウェブアプリで散らかった面倒なGASをひとまとめにしました。

経緯

クライアントごとのスプレットシートでGASが動いており、シートからシートへデータの送信を行なっているものがありました。

スクリーンショット 2025-12-25 1.12.02.png

クライアントの数だけコピーされて増殖するし、現場でクライアントに合わせた形でシートを書き換えられるのでエラーが頻発して保守性が最悪。

GASにアップデートを加えようものならクライアント分全てのGASを順番に回って修正する必要がある大変面倒な仕様でした。

またバージョン管理ができておらず、アップデート漏れがさらなるエラーを引き起こしました。

保守に追われるのが耐えられなかったので、全クライアントのGASの処理を一つのアプリで一括にまとめて行うことにしました。

スクリーンショット 2025-12-25 1.08.22.png

改善後
全ての処理を一つの「ウェブアプリ」に集約。各シートからはAPIを叩くように処理を呼び出す構成に変更しました。

これにより、ロジックの修正はウェブアプリ側の1箇所だけで完結するようになりました。

  1. GASウェブアプリのデプロイ方法

コードの記述: doPost(e) 関数を定義し、リクエストに応じて処理を振り分けるようにします。

デプロイ設定:
GASを開いて右上の [デプロイ] > [新しいデプロイ] > 種類で [ウェブアプリ] を選択。
スクリーンショット 2025-12-25 8.50.56.png
スクリーンショット 2025-12-25 8.51.25.png

スクリーンショット 2025-12-25 8.52.36.png

次のユーザーとして実行:
「自分」に設定(これにより権限のないユーザーの操作も代行可能)。

アクセスできるユーザー:
「全員」または組織。

URLの発行:
発行されたウェブアプリのアドレスを各シートのスクリプトで呼び出して利用します。

呼び出し方(各シートからの連携)

各クライアントのシート側からは、UrlFetchApp を使って中央のアプリを呼び出します。
形式としてはヘッダーのないAPIですね。
アプリのデプロイ設定で「アクセスできるユーザー:全員(Anyone)」にしている場合、Googleアカウントの認証ヘッダーがなくてもリクエストが届きます。
あとはbodyのdataにJSONをいれて大元のcallCentralApp関数を起動させてあげればアプリにデータを送信できます。

クライアント側.gs
function callCentralApp() {
  const url = "発行されたウェブアプリのURL";
  const payload = {
    clientName: "Client_A",
    data: "送信したいデータ"
  };
  
  const options = {
    method: "post",
    contentType: "application/json", // 明示的に指定するのがおすすめ
    payload: JSON.stringify(payload)
  };
  
  UrlFetchApp.fetch(url, options);
}

アプリ側の処理

リクエストが送られるとdoPostが反応します。"e"にjsonデータが入っているので取り出して自由に使えます。
私の場合はこのなかで、データの加工やべつシートへのデータ書き込み処理を記入しました。
returnには、エラーが起きた際に送信元シートへ内容を通知するメッセージをもたせました。

アプリ側.gs
function doPost(e) {
  // 送られてきたデータを解析
  const params = JSON.parse(e.postData.contents);
  
  // 何らかの処理(例:ログ出力や計算など)
  const result = "Received: " + params.clientName;

  // 呼び出し側に結果を返す
  return ContentService.createTextOutput(result);
}

内容に変更を加えた際は再度デプロイをしてください!
変更内容が反映されません。

最新のバージョン選択してデプロイ!
スクリーンショット 2025-12-25 10.52.58.png

ライブラリとウェブアプリ、どう差別化する?

ある程度GASを触った人なら、今回のケースでは処理をライブラリ化させて各シートに埋め込んだ方がいいと思うかもしれません。
しかし今回のようなケースで「ライブラリ」ではなく「ウェブアプリ」を選んだのには理由があります。

比較項目 ウェブアプリ ライブラリ
更新の反映 デプロイ更新で即時反映 各シートでライブラリの手動更新
実行権限 作成者の権限で動く 操作者の権限で動く
主な用途 処理の中央集権化 関数の共通パーツ化

ライブラリは内部のコードを編集してデプロイしたあと、呼び出し側で個別に手動バージョンアップを行う必要がでてきます。
対するウェブアプリはデプロイで即時反映。シート側のコードをいじる必要がありません。
またアプリの処理は実行者が開発者自身として行われるので、権限がない人でも関数を動かせます。
頻繁にバージョンアップを行うメイン処理をひとまとめにするにはウェブアプリがいいです。

逆に、各シートごとに異なる設定値を保持しつつ、便利な関数だけ共通化したいなら「ライブラリ」が適しています。APIを叩く必要がなくコードの可読性良く、比較的速度が早いです。

まとめ

シートに紐づいて増殖するGASはメイン処理をウェブアプリに移して一括管理。修正や更新作業は1つのGASに集約されます。
保守に追われる時間を減らし、機能開発に時間を使いましょう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?