SECTION 08

Google Apps Script 入門

プログラミング未経験でもできる!Googleサービス自動化の第一歩

LCREATOR.Inc Google AI 研修プログラム

SECTION 08

なぜ Google Apps Script なのか?

OVERVIEW

チャットAIの限界

チャットAIは便利ですが、基本的に「1対1」の対話です。100件のメールを要約したい、500行のデータを分類したい...それを1件ずつコピペしますか?

GASが解決する課題

GASを使えば「1対1,000」の自動処理が可能に。スプレッドシートがUIになり、ボタン一つで大量データを一括処理できます。

AIをチャットから「業務の仕組み」に変える。
それがGASの役割です。

chat チャットAI: 1件ずつ手作業
bolt GAS + AI: 一括自動処理
1
チャット (対話)
1,000+
GAS (一括処理)

SECTION 08

GASとは何か

BASIC

Google Apps Script の3つの特徴

JS

JavaScriptベース

世界で最も使われているプログラミング言語がベース。学習リソースが豊富です。

language

ブラウザだけで動く

インストール不要。Chromeさえあれば、すぐに開発・実行できます。

🆓

完全無料

Google Workspaceユーザーなら追加料金なし。サーバーもGoogleが提供します。

GASの正体

Google Apps Script は、Googleが提供するクラウド上のスクリプト実行環境です。スプレッドシート、Gmail、ドライブなどのGoogleサービスを、プログラムから直接操作できます。

lightbulb
「プログラミング」と聞くと難しそうですが、GASは数行のコードから始められます。コピペで動くサンプルも豊富です。

SECTION 08

GASでできること一覧

OVERVIEW

メール自動送信

シートのデータをもとに、個別メールを一括送信。宛名・内容も自動差し替え。

シート操作

データの読み書き、集計、フィルタリング。手作業の集計を自動化。

Drive管理

フォルダ作成、ファイル移動、共有設定の自動化。大量ファイルの整理に。

外部API連携

Gemini API、Slack、Chatworkなど外部サービスとの連携が可能。

カレンダー連携

予定の自動登録、リマインダー送信。会議室予約の自動化も。

フォーム連携

フォーム回答の自動処理。集計・通知・承認フローを自動構築。

SECTION 08

GAS vs 他の自動化ツール

COMPARE
比較項目 GAS Zapier Power Automate Python
費用 無料 月$19.99〜 月$15〜 無料(環境構築要)
学習コスト 低〜中 低(GUI操作) 低(GUI操作)
Google連携 ネイティブ対応 API経由 コネクタ経由 API経由
カスタマイズ性 高い 中程度 中程度 非常に高い
環境構築 不要 不要 不要 必要
おすすめ Google Workspace ユーザーに最適 多サービス連携 Microsoft 365環境 高度な処理
check_circle
Google Workspace を使っているなら、まずGASから始めるのが最も効率的です。無料・環境構築不要・Googleサービスとネイティブ連携の3拍子が揃っています。

SECTION 08

スクリプトエディタを開く

STEP 01
1

スプレッドシートを開く

Google スプレッドシートを新規作成、または既存のファイルを開きます。

2

「拡張機能」メニューをクリック

上部メニューバーの「拡張機能」をクリックします。

3

「Apps Script」を選択

ドロップダウンから「Apps Script」を選択すると、新しいタブでエディタが開きます。

docs.google.com/spreadsheets/d/...
拡張機能 → Apps Script の選択画面
lightbulb
直接 script.google.com にアクセスして「新しいプロジェクト」を作成することもできます。

SECTION 08

エディタ画面の見方

STEP 02
script.google.com/home/projects/...
Apps Script エディタの全体画面
1

ファイルパネル(左)

プロジェクトのファイル一覧。.gsファイルやHTML ファイルを管理します。

2

コードエディタ(中央)

スクリプトを書く場所。構文ハイライトと自動補完が使えます。

3

実行ログ(下部)

Logger.log() の出力やエラーメッセージが表示されます。

4

デプロイボタン(右上)

Webアプリやアドオンとして公開するときに使います。

SECTION 08

Hello World - 最初のスクリプト

STEP 03

エディタに最初から表示されている myFunction を書き換えてみましょう。

GAS function myFunction() { // ログにメッセージを表示する Logger.log("Hello! GASの世界へようこそ!"); // ダイアログでメッセージを表示する Browser.msgBox("こんにちは!"); }
play_arrow
上部の「実行」ボタンをクリックすると、スクリプトが実行されます。初回は権限の承認が求められます。

実行結果

実行ログの確認

「表示」→「ログ」で Logger.log の出力を確認できます。「Hello! GASの世界へようこそ!」と表示されれば成功です。

ダイアログの表示

スプレッドシートに戻ると、ポップアップダイアログが表示されます。

初回実行時のポイント: 「このアプリは確認されていません」と表示されたら、「詳細」→「(安全でないページ)に移動」をクリックして承認してください。

SECTION 08

変数と関数の基本

STEP 04

変数の宣言

GAS // let: 後から値を変更できる変数 let count = 0; count = count + 1; // OK // const: 値を変更できない定数 const TAX_RATE = 0.1; // TAX_RATE = 0.2; エラー!
lightbulb
基本ルール: 変更しない値は const、変更する値は let を使いましょう。

関数の定義

GAS // 税込価格を計算する関数 function calcTax(price) { const TAX_RATE = 0.1; return price * (1 + TAX_RATE); } // 関数を使う function main() { const result = calcTax(1000); Logger.log(result); // 1100 }
warning
var は古い書き方です。新しいコードでは let / const を使いましょう。

スプレッドシート操作

GASの真骨頂 -- シートのデータをプログラムで自在に操る

SECTION 08

セルの読み書き

SHEET 01

基本の3ステップ

GAS function readAndWrite() { // 1. シートを取得 const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); // 2. セルの値を読む const name = sheet .getRange("A1") .getValue(); Logger.log(name); // 3. セルに値を書く sheet.getRange("B1") .setValue("処理済み"); }

主要メソッド

メソッド 説明
getRange("A1") セルA1を選択
getValue() セルの値を取得
setValue(値) セルに値を設定
getRange(行, 列) 行番号・列番号で指定
lightbulb
getRange("A1")getRange(1, 1) は同じセルを指します。ループ処理では数値指定が便利です。

SECTION 08

範囲操作 - データの一括取得

SHEET 02
GAS function readAllData() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); // データが入っている範囲を自動検出 const data = sheet .getDataRange() .getValues(); // data は2次元配列 // data[0] = ヘッダー行 // data[1] = 2行目のデータ // data[1][0] = 2行目A列の値 Logger.log(data[0]); // ヘッダー Logger.log(data.length); // 行数 }

2次元配列のイメージ

A列 [0]B列 [1]C列 [2]
1行目 [0]名前部署メール
2行目 [1]田中営業部tanaka@...
3行目 [2]佐藤開発部sato@...

ポイント: getValues() は全データを一度に取得するので、1セルずつ getValue() を呼ぶより圧倒的に高速です。

warning
配列のインデックスは 0始まり。1行目は data[0]、A列は [0] です。

SECTION 08

データの書き込み

SHEET 03

一括書き込み

GAS function writeData() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); // 2次元配列で一括書き込み const output = [ ["田中", "営業部", 85], ["佐藤", "開発部", 92], ["鈴木", "総務部", 78] ]; sheet.getRange(2, 1, 3, 3) .setValues(output); }

最終行に追加

GAS function appendRow() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); // 最終行の次に1行追加 sheet.appendRow([ "山田", "企画部", 88, new Date() // 現在日時 ]); }
lightbulb
getRange(行, 列, 行数, 列数) で範囲を指定します。setValues() に渡す配列のサイズと一致させてください。

SECTION 08

for文によるバッチ処理

SHEET 04
GAS function batchProcess() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); const data = sheet.getDataRange().getValues(); // ヘッダー行をスキップして処理 for (let i = 1; i < data.length; i++) { const name = data[i][0]; // A列: 名前 const score = data[i][2]; // C列: 点数 const status = data[i][3]; // D列: ステータス // 処理済みはスキップ if (status === "完了") continue; // 70点以上なら「合格」、未満なら「再試験」 const result = score >= 70 ? "合格" : "再試験"; // E列に結果、D列に「完了」を書き込み sheet.getRange(i + 1, 5).setValue(result); sheet.getRange(i + 1, 4).setValue("完了"); } }

処理の流れ

A: 名前B: 部署C: 点数D: ステータスE: 結果
田中営業部85完了合格
佐藤開発部60完了再試験
鈴木総務部92完了合格

ポイント: 「ステータス列」を使うことで、途中でエラーが起きても再実行時に処理済みの行をスキップできます。大量データ処理の定番パターンです。

UI・権限・セキュリティ

安全で使いやすいスクリプトに仕上げるための設定

SECTION 08

カスタムメニューの作成

UI 01

スプレッドシートのメニューバーに、独自のメニューを追加できます。非エンジニアでもボタン一つで処理を実行可能に。

GAS // スプレッドシートを開いたとき自動実行 function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu(' AI処理') .addItem('データを集計', 'aggregateData') .addItem('レポート作成', 'createReport') .addSeparator() .addItem('設定', 'showSettings') .addToUi(); } function aggregateData() { Browser.msgBox("集計を開始します!"); // ここに集計ロジックを書く }
docs.google.com/spreadsheets/d/...
カスタムメニュー「AI処理」の表示イメージ
check_circle
onOpen は特別な関数名で、スプレッドシートを開くたびに自動で実行されます。メニューの登録に最適です。

SECTION 08

トリガー設定

UI 02

トリガーの種類

schedule

時間駆動型

「毎朝9時に実行」「1時間ごとに実行」など、スケジュール実行ができます。

edit_note

フォーム送信時

Googleフォームに回答が送信されたら自動で処理を実行します。

description

スプレッドシート編集時

セルが編集されたら自動で処理を実行。リアルタイム連動に便利です。

トリガーの設定手順

1

エディタの左メニューで「トリガー」(時計アイコン)をクリック

2

「トリガーを追加」ボタンをクリック

3

実行する関数・イベントの種類・頻度を設定

4

「保存」をクリック

lightbulb
トリガーは最大20個まで設定可能。GASの無料枠では1日の実行時間が合計90分までです。

SECTION 08

APIキーの安全管理

SECURITY

絶対にやってはいけないこと

NG // APIキーをコードに直接書く const API_KEY = "AIzaSyB..."; // 危険!

正しい方法: PropertiesService

GAS // APIキーを安全に取得 const API_KEY = PropertiesService .getScriptProperties() .getProperty("GEMINI_API_KEY");

設定手順

1

エディタの「プロジェクトの設定」を開く

左メニューの歯車アイコンをクリック

2

「スクリプトプロパティ」セクションへ

「スクリプトプロパティを追加」をクリック

3

プロパティ名と値を入力

プロパティ: GEMINI_API_KEY / 値: あなたのAPIキー

lock
スクリプトプロパティに保存したキーは、コードには表示されません。共同編集者にも見えないため安全です。

SECTION 08

実行権限とスコープ

SECURITY

初回認証の仕組み

GASは初回実行時に、スクリプトがアクセスするサービスへの権限を求めます。これはGoogleのセキュリティ機能です。

play_arrow 実行
enhanced_encryption 認証画面
check_circle 許可
bolt 動作開始

主なスコープ(権限の範囲)

使うサービス要求される権限
SpreadsheetAppスプレッドシートの閲覧・編集
GmailAppメールの閲覧・送信
DriveAppDriveファイルの閲覧・編集
UrlFetchApp外部URLへのアクセス
CalendarAppカレンダーの閲覧・編集
warning
最小権限の原則: 必要なサービスだけを使いましょう。不要なサービスのメソッドを書くと、余計な権限を要求してしまいます。

ハンズオン

実際に手を動かして体験しよう

SECTION 08

ハンズオン 1: Hello World

HANDS-ON
1

新しいスプレッドシートを作成

sheets.new にアクセスすると素早く作れます。

2

「拡張機能」→「Apps Script」を開く

新しいタブでエディタが起動します。

3

以下のコードを入力して「実行」

GAS function myFunction() { // ログに表示 Logger.log("Hello! GASの世界へようこそ!"); // スプレッドシートのA1セルにも書き込み const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); sheet.getRange("A1") .setValue("GAS動作確認OK!"); }

確認ポイント: 実行後にスプレッドシートのA1セルに「GAS動作確認OK!」と表示されれば成功です。

SECTION 08

ハンズオン 2: セルの読み書き

HANDS-ON

準備: スプレッドシートにデータ入力

A列B列
りんご150
バナナ100
みかん80

上記のデータをA1:B3に手入力してください。

スクリプト: 税込価格を計算

GAS function calcTaxPrice() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); const data = sheet.getDataRange().getValues(); for (let i = 0; i < data.length; i++) { const price = data[i][1]; // B列の価格 const taxPrice = price * 1.1; // C列に税込価格を書き込み sheet.getRange(i + 1, 3) .setValue(taxPrice); } }
check_circle
C列に税込価格(165, 110, 88)が表示されれば成功です。

SECTION 08

ハンズオン 3: カスタムメニューを作る

HANDS-ON
GAS function onOpen() { SpreadsheetApp.getUi() .createMenu(' 便利ツール') .addItem('税込計算', 'calcTaxPrice') .addItem('データクリア', 'clearResults') .addToUi(); } function clearResults() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); const lastRow = sheet.getLastRow(); // C列のデータをクリア if (lastRow > 0) { sheet.getRange(1, 3, lastRow, 1).clearContent(); } Browser.msgBox("C列をクリアしました!"); }

確認手順

1

コードを保存してスプレッドシートをリロード

onOpen は開いたときに実行されるため、リロードが必要です。

2

メニューバーに「便利ツール」が追加されていることを確認

3

「税込計算」をクリックして動作確認

lightbulb
前のハンズオンで作った calcTaxPrice 関数をメニューから呼び出しています。関数を組み合わせることで機能を拡張できます。

SECTION 08

ハンズオン 4: タイマートリガーを設定

HANDS-ON

毎日9時に実行する関数を作成

GAS function dailyReport() { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getActiveSheet(); const today = new Date(); const dateStr = Utilities .formatDate(today, "Asia/Tokyo", "yyyy/MM/dd HH:mm"); // 最終行に日時を記録 sheet.appendRow([ dateStr, "自動実行されました" ]); }

トリガーの設定手順

1

左メニューの「トリガー」(時計アイコン)を開く

2

「トリガーを追加」をクリック

3

以下の設定を入力

関数: dailyReport / イベント: 時間主導型 / タイプ: 日付ベース / 時間: 午前9時〜10時

4

「保存」して完了

check_circle
翌朝9時以降にスプレッドシートを確認すると、日時と「自動実行されました」が記録されているはずです。

SECTION 08

よくあるエラーと対処法

TROUBLESHOOT

TypeError

TypeError: Cannot read properties of undefined

原因: 存在しないセルや変数にアクセスしている

対策: 配列のインデックスが正しいか、データ範囲を確認する

権限エラー

Exception: You do not have permission to call ...

原因: スクリプトの権限が未承認

対策: エディタから手動実行して認証画面を表示し、承認する

API制限

Exception: Service invoked too many times

原因: 短時間にAPIを呼びすぎた

対策: Utilities.sleep(1000) で1秒待機を入れる

lightbulb
デバッグのコツ: Logger.log(変数名) を使って、処理の途中で変数の中身を確認しましょう。問題の切り分けに役立ちます。

SECTION 08

GAS開発のベストプラクティス

BEST PRACTICE
edit_note

分かりやすい命名

関数名は「何をするか」が分かる名前に。
f1()sendMonthlyReport()

chat

コメントを書く

「何をしているか」ではなく「なぜそうするか」を書きましょう。未来の自分への説明書です。

science

段階的テスト

小さな機能を作る → テスト → 次の機能、の繰り返し。一度に全部作らないのがコツです。

bolt

一括操作を使う

getValue() をループで100回呼ぶより、getValues() で一括取得。10倍以上高速になります。

lock

APIキーは PropertiesService に

コードにパスワードやキーを直接書かない。必ずスクリプトプロパティに保管しましょう。

assignment

ステータス列を活用

処理済み/未処理を管理する列を用意。途中でエラーが起きても安全に再実行できます。

SECTION 08

まとめ: GAS入門チェックリスト

SUMMARY

基礎知識

  • GASはブラウザで動くJavaScriptベースの自動化ツール
  • スプレッドシートの「拡張機能」からエディタを開ける
  • let/const で変数宣言、function で関数定義
  • Logger.log() でデバッグ出力を確認できる

スプレッドシート操作

  • getRange / getValue / setValue でセル操作
  • getDataRange().getValues() で一括取得
  • for文でバッチ処理、ステータス列で進捗管理

UI・セキュリティ

  • onOpen() でカスタムメニューを追加できる
  • トリガーで定期実行・イベント駆動が可能
  • APIキーは PropertiesService に安全保管
  • 最小権限の原則で必要なスコープだけ使用

GASは「非エンジニアが最も簡単に始められる自動化ツール」です。次のセクションでは、ここにAI(Gemini API)の力を組み込みます。

セクション08 完了

お疲れさまでした!次はGASにAIの頭脳を組み込みます。

次へ → セクション09: GAS x Gemini API 連携
学習項目
9
ハンズオン
4
所要時間
45分
🏠 研修ポータル ▶ この章の動画 📺 動画一覧