GAS 完全初心者マニュアル

プログラミング不要。
業務を、自動化しよう。

Google Apps Script(GAS)は、Gmail・スプレッドシート・カレンダーを自由に操る「魔法の杖」。プログラミング未経験でも、今日から業務自動化を始められます。

0
Introduction

魔法の杖を手に入れる

毎朝、特定のメールを探してスプレッドシートに転記する作業。同じフォーマットの報告書をPDFにしてチャットに投げる作業。もし、これらを「寝ている間」に終わらせる小人がいたらどうでしょうか。

Google Apps Script(通称:GAS)は、まさにその小人を召喚する「魔法の杖」です。Googleが無料で提供しているこの機能を使えば、Gmail、カレンダー、スプレッドシートなど、Googleのサービスを自由自在に操ることができます。

💡
WHY GAS? GASの3つの魅力
  1. 環境構築が不要:ブラウザさえあれば、今すぐ始められます。
  2. 連携が超強力:Googleのサービス間はもちろん、SlackやLINEなどの外部サービスとも繋がります。
  3. 無料で自動化:指定した時間に勝手に動く「トリガー」機能が無料で使えます。

このマニュアルは、プログラミングやコード、スクリプトという言葉にアレルギーがある方でも、ステップバイステップで確実に「魔法使い」になれるように設計されています。エラーは失敗を責めているわけではありません。「ここを直して!」という小人からのメッセージです。リラックスして、楽しんで進めていきましょう。

1
Mindset

心構えと最初の一歩

まずは、GASの世界に入るための扉を開けましょう。用意するのはGoogleアカウントとブラウザだけです。

初めてのスクリプトエディタ

画面に function myFunction() { } という暗号が表示されたはずです。これが魔法の呪文を書くキャンバスです。

💡
Tips: エラーを恐れない

赤文字のエラーが出ても、パソコンが壊れることはありません。「あ、タイポ(打ち間違い)したかな」くらいの気持ちで構いません。

2
JavaScript

レシピの書き方(JS基礎)

GASは「JavaScript(ジャバスクリプト)」という言語で書かれています。プログラミングとは「料理のレシピ」を書くようなものです。「材料(変数)」を用意して、「手順(条件分岐や繰り返し)」を指示します。

1. 材料を入れる箱(変数)

まずはデータを入れておく箱を用意します。letは中身を入れ替えられる箱、constは入れ替えられない(固定の)箱です。

Code
function testVariables() {
  let message = "こんにちは"; // 入れ替えられる箱
  const name = "藤川さん";    // 固定の箱

  // 小人にメッセージを喋らせる
  console.log(message + "、" + name);
}

2. もし〜だったら(条件分岐: if文)

レシピによくある「焦げ目がついたら火を止める」という指示です。

Code
function testIf() {
  const score = 85;
  if (score >= 80) {
    console.log("合格!素晴らしいです。");
  } else {
    console.log("不合格。また頑張りましょう。");
  }
}

3. 同じ作業を繰り返す(for文)

「100個の玉ねぎをみじん切りにする」という指示を、100回書くのは大変です。そこで for を使います。

Code
function testFor() {
  for (let i = 1; i <= 3; i++) {
    console.log(i + "回目の挨拶:こんにちは!");
  }
}
神ショートカット3選
  • Alt + / または Ctrl + Space : コードの自動補完(小人が続きを予想してくれます)
  • Ctrl + R (Macは Cmd + R) : 実行
  • Ctrl + S (Macは Cmd + S) : 保存
3
Spreadsheet

スプレッドシートの支配

GASでスプレッドシートを操作するには、「マトリョーシカ人形」のような構造を理解する必要があります。一番大きな人形(アプリ)から順番に開けていき、最後に一番小さな人形(セル)にたどり着きます。

📝
OBJECT HIERARCHY マトリョーシカ構造
  1. SpreadsheetApp (アプリ全体)
  2. getActiveSpreadsheet() (今開いているファイル)
  3. getActiveSheet() (今開いているシート)
  4. getRange("A1") (A1セル)
  5. getValue() / setValue() (値の取得・書き込み)

セルに文字を書き込むスクリプトはこうなります:

Code
function writeToCell() {
  // マトリョーシカを順番に開ける
  const app = SpreadsheetApp;
  const file = app.getActiveSpreadsheet();
  const sheet = file.getActiveSheet();
  const cell = sheet.getRange("A1");
  
  // A1セルに書き込む!
  cell.setValue("魔法の世界へようこそ!");
}
4
Hands-on 1

【実践1】売上データ自動集計

基礎を学んだところで、さっそく実践に入りましょう。毎日の売上データを一括で読み込み、集計して結果を書き出すスクリプトです。

💡
重要な考え方

GASではセルを1つずつ読み書きすると非常に遅くなります(後述する「6分の壁」に引っかかります)。そのため、「まとめて読み込み、まとめて書き出す」のが鉄則です。

Code
function summarizeSales() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // A2:C100 のデータを「二次元配列(表)」として一括で取得
  const data = sheet.getRange("A2:C100").getValues();
  
  let totalSales = 0;
  
  // データを行ごとにループ処理
  for (let i = 0; i < data.length; i++) {
    const row = data[i];
    const amount = row[2]; // C列(0始まりなので2)が金額だと想定
    
    // 空白セルはスキップ
    if (amount !== "") {
      totalSales += Number(amount);
    }
  }
  
  // E1セルに合計を出力
  sheet.getRange("E1").setValue("合計売上");
  sheet.getRange("F1").setValue(totalSales);
}

この「一括取得 (getValues) して、メモリ内で計算し、一括出力する」というパターンは、GASにおける黄金の型(ベストプラクティス)です。

5
Authorization

カスタム関数と承認の壁

GASで作った関数は、スプレッドシート上で =SUM() のように呼び出すことができます(カスタム関数)。

Code
/**
 * 消費税込みの価格を計算するカスタム関数
 * @customfunction
 */
function CALC_TAX(price) {
  return price * 1.1;
}

これを保存すると、シート上で =CALC_TAX(1000) のように使えるようになります。@customfunction をコメントに書くことで、シート上で補完されるようになります。

⚠️ 「このアプリは確認されていません」という警告が出たら

初めてGmailやカレンダーを操作するスクリプトを実行すると、恐ろしい警告画面が出ます。しかし、安心してください。これは失敗ではありません。魔法使いになるための「通過儀礼」です。

🔑
BREAKTHROUGH 警告画面の突破方法
  1. 「権限を確認」をクリックし、自分のGoogleアカウントを選択。
  2. 「このアプリは確認されていません」と出たら、左下の「詳細」をクリック。
  3. 「(安全ではないページ)に移動」というリンクをクリック。
  4. 最後に「許可」をクリック。

※自分で書いたコードなので、安全ではないということはありません。堂々と突破してください。

6
Hands-on 2

【実践2】Gmailダイジェスト

「要対応」というラベルがついた未読メールを収集し、毎朝自分宛てにダイジェストメールを送る魔法です。GmailApp を使います。

Code
function sendEmailDigest() {
  // 「要対応」ラベルの未読メールを検索
  const threads = GmailApp.search('label:要対応 is:unread');
  
  if (threads.length === 0) {
    console.log("未読の要対応メールはありません。");
    return;
  }

  let body = "未対応のメール一覧です:\n\n";

  // 見つかったメールスレッドを順番に処理
  for (let i = 0; i < threads.length; i++) {
    const message = threads[i].getMessages()[0];
    body += "・" + message.getSubject() + "\n";
    body += "  URL: " + threads[i].getPermalink() + "\n\n";
  }

  // 自分宛てにメールを送信
  const myEmail = Session.getActiveUser().getEmail();
  GmailApp.sendEmail(myEmail, "【朝のダイジェスト】要対応メール", body);
}
7
Hands-on 3

【実践3】カレンダー自動予約

スプレッドシートに入力された「日付・タイトル・時間」のリストを読み込み、Googleカレンダーに一括で予定を登録するスクリプトです。CalendarApp を使います。

Code
function createEventsFromSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getRange("A2:C10").getValues(); // A列:日付, B列:タイトル, C列:時間
  
  // デフォルトのカレンダーを取得
  const calendar = CalendarApp.getDefaultCalendar();

  for (let i = 0; i < data.length; i++) {
    const title = data[i][1];
    const dateStr = data[i][0];
    const timeStr = data[i][2]; // "10:00" など
    
    if (title && dateStr) {
      // 開始日時と終了日時を作成 (1時間の予定とする)
      const startTime = new Date(dateStr + " " + timeStr);
      const endTime = new Date(startTime.getTime() + (60 * 60 * 1000)); 
      
      // カレンダーに予定を作成
      calendar.createEvent(title, startTime, endTime);
      console.log("作成完了: " + title);
    }
  }
}
8
Hands-on 4

【実践4】フォーム自動集計ダッシュボード

Googleフォームからの回答をリアルタイムに集計するスクリプトです。このコードは、フォームに紐づいたスプレッドシート上で実行します。

Code
function onFormSubmit(e) {
  // フォーム送信時に渡されるイベントオブジェクト(e)から値を取得
  const responses = e.namedValues;
  const name = responses['お名前'][0];
  const rating = responses['満足度'][0]; // 例: "5"
  
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("集計ダッシュボード");
  
  // 満足度に応じて、集計シートの特定のセル(例: B2, B3...)をカウントアップする
  const cellAddress = "B" + (Number(rating) + 1); // 満足度5なら B6 を更新
  const currentCount = sheet.getRange(cellAddress).getValue();
  sheet.getRange(cellAddress).setValue(currentCount + 1);
  
  // 評価が低い場合はアラートメールを送信
  if (Number(rating) <= 2) {
    GmailApp.sendEmail("admin@example.com", "【アラート】低評価の回答", name + "様から低い評価がありました。");
  }
}

※このスクリプトを動かすには、後述の「トリガー機能」で onFormSubmit を「フォーム送信時」に設定する必要があります。

9
Hands-on 5

【実践5】Slack/Teams通知(外部API連携)

GASの最大の魅力は、Googleの外の世界とも繋がれることです。UrlFetchApp を使うことで、SlackやTeamsにメッセージを送ることができます。

Code
function postToSlack() {
  // SlackのIncoming Webhook URL(※実際のURLに置き換えてください)
  const webhookUrl = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ";
  
  // 送信するメッセージ(ペイロード)を作成
  const payload = {
    "text": "こんにちは!GASからの自動通知です🤖"
  };
  
  // 送信用の設定オプション
  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };
  
  // 外部APIへデータを送信!
  UrlFetchApp.fetch(webhookUrl, options);
}
10
Triggers

トリガーと自律稼働

魔法の準備は整いました。最後に、小人に「いつ魔法を使うか」を指示します。これがトリガーです。エディタの左側にある時計マーク(トリガー)をクリックして設定します。

⚙️
AUTOMATION 主なトリガーの種類
  • 時間主導型(Time-driven): 「毎日朝8時」「1時間おき」など、スケジュールに合わせて実行します。【実践2】のダイジェストなどに最適です。
  • イベント主導型(Event-driven): 「シートが編集された時」「フォームが送信された時」など、何らかのアクションを検知して実行します。【実践4】の集計などに使います。
  • シンプル・トリガー: 関数名を onEdit(e)onOpen(e) にするだけで、編集時やファイルを開いた時に自動実行されます。
11
Quotas

実運用の壁(制限とクォータ)

GASは何でもできる万能基盤ではありません。無料で使える分、いくつかの明確な制限が設けられています。これらは「障害」ではなく、「システムを設計する上での制約事項」として捉えましょう。

1. 最大の壁:6分制限(Timeout)

1回のスクリプト実行は最大6分間で強制終了されます。大量のデータを処理する場合、【実践1】で学んだように getValues()setValues() を使ってメモリアクセスを最小限に抑える必要があります。

2. クォータ(1日の上限)

Googleの各サービスには1日あたりの呼び出し上限が設定されています。例えば、一般のアカウントでは GmailApp.sendEmail は1日100件まで(Workspaceアカウントは1500件)です。エラー(例:Service invoked too many times)が出た場合は、上限に達したサインです。

💡
秘密情報の管理(PropertiesService)

APIキーやWebhook URLなどの秘密情報をコードに直接書くのは危険です。PropertiesService.getScriptProperties().getProperty('SLACK_URL') のように、GASのプロジェクト設定に保存した環境変数から読み込むのがプロのやり方です。

12
Conclusion

最後に:自動化の魔法使いへ

ここまで読んでいただき、ありがとうございます。あなたはもう、立派なGASの魔法使いです。

最初はエラーが出るかもしれません。上手く動かなくてイライラするかもしれません。でも、小さな自動化が成功したときの「おおっ!」という感動は、何物にも代えがたいものです。

まずは、毎日の小さな「めんどくさい」を見つけて、スクリプトエディタを開いてみてください。あなたの業務が、そして人生が、少しだけ楽に、そして楽しくなることを願っています。