MENU

【完全ガイド】GASでスプレッドシートを自動化する方法

【完全ガイド】GASでスプレッドシートを自動化する方法

「毎月の集計作業、もっとラクにできないかな…」

そんな悩みを抱えている方に朗報です。Google Apps Script(GAS)を使えば、スプレッドシートの面倒な作業を無料で自動化できます。

この記事では、プログラミング未経験の方でも理解できるよう、GASによるスプレッドシート自動化の基本から実践的なテクニックまでを丁寧に解説します。

この記事で学べること:

  • GASの基本的な使い方
  • セルの読み書き操作
  • 実務で使える自動化パターン5選
  • トリガーを使った完全自動化の方法

目次

GASとスプレッドシート連携でできること

GAS(Google Apps Script)は、Googleが提供する無料のスクリプト環境です。JavaScriptをベースにしており、Googleのサービス(スプレッドシート、Gmail、カレンダーなど)を自動操作できます。

GAS × スプレッドシートで実現できる自動化の例

自動化の種類 具体例 削減できる時間(目安)
データ入力 フォーム回答の自動転記 月5時間
レポート作成 日次・週次レポートの自動生成 月10時間
通知・連絡 条件に応じた自動メール送信 月3時間
データ整理 重複削除、フォーマット統一 月4時間
外部連携 Slack、LINE、ChatGPTとの連携 月8時間

「プログラミングは難しそう…」と思う方もいるかもしれません。

しかし、GASはExcelのVBAよりもシンプルな文法で書けます。また、コピペで動くコードをこの記事で多数紹介しますので、まずは動かしてみることから始めましょう。


準備:GASエディタの開き方

GASを使うには、まずエディタ(コードを書く画面)を開く必要があります。手順はとても簡単です。

手順1:スプレッドシートを開く

Googleドライブから任意のスプレッドシートを開きます。新規作成でも、既存のファイルでも構いません。

[画像: Googleドライブでスプレッドシートを新規作成する画面]

手順2:拡張機能からApps Scriptを開く

スプレッドシートのメニューから、以下の順にクリックします。


拡張機能 > Apps Script

[画像: スプレッドシートのメニューからApps Scriptを選択する画面]

手順3:エディタが開く

新しいタブでGASエディタが開きます。最初は以下のような画面が表示されます。


function myFunction() {

}

このmyFunctionの中にコードを書いていきます。

[画像: GASエディタの初期画面]

手順4:名前を変更して保存

画面左上の「無題のプロジェクト」をクリックし、分かりやすい名前に変更しましょう(例:「スプレッドシート自動化」)。

ポイント: GASのファイルはGoogleドライブに自動保存されますが、明示的に保存するにはCtrl + S(Mac: Cmd + S)を押します。


基本編:セルの読み書き

GASでスプレッドシートを操作するには、まず「どのシートの、どのセルを操作するか」を指定する必要があります。

基本的な流れ


// 1. スプレッドシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();

// 2. シートを取得
const sheet = ss.getSheetByName('シート1');

// 3. セルを操作
const value = sheet.getRange('A1').getValue();

この3ステップが基本形です。覚えておきましょう。


データの取得(getValue, getValues)

セルからデータを読み取る方法を見ていきましょう。

単一セルの値を取得:getValue()


function getSingleValue() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');

  // A1セルの値を取得
  const value = sheet.getRange('A1').getValue();

  // ログに出力(確認用)
  console.log(value);
}

実行方法:

  • 上記コードをエディタに貼り付け
  • 関数名「getSingleValue」を選択(ドロップダウンから選ぶ)
  • 「▶ 実行」ボタンをクリック

[画像: GASエディタで関数を実行する画面]

初回実行時は「承認が必要です」と表示されます。「権限を確認」→「許可」をクリックして進めてください。

複数セルの値を一括取得:getValues()

範囲のデータをまとめて取得するにはgetValues()を使います。


function getMultipleValues() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');

  // A1:C10の範囲を取得(10行×3列)
  const values = sheet.getRange('A1:C10').getValues();

  // 結果は2次元配列
  // values[0][0] → A1の値
  // values[0][1] → B1の値
  // values[1][0] → A2の値

  console.log(values);
}

パフォーマンスのコツ: getValue()を何度も呼ぶより、getValues()で一括取得する方が処理速度が大幅に向上します。100行のデータなら、100回のgetValue()より1回のgetValues()の方が約10倍速いです。


データの書き込み(setValue, setValues)

セルにデータを書き込む方法です。

単一セルへの書き込み:setValue()


function setSingleValue() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');

  // A1セルに「Hello GAS!」と書き込み
  sheet.getRange('A1').setValue('Hello GAS!');
}

複数セルへの一括書き込み:setValues()


function setMultipleValues() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');

  // 書き込むデータ(2次元配列)
  const data = [
    ['名前', '部署', '売上'],
    ['田中', '営業', 1000000],
    ['佐藤', '開発', 800000],
    ['鈴木', '人事', 600000]
  ];

  // A1:C4に一括書き込み
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

注意点: setValues()で書き込む2次元配列のサイズと、指定する範囲のサイズは一致させる必要があります。


実践編:よく使う自動化パターン5選

ここからは、実務で即使える自動化パターンを5つ紹介します。すべてコピペで動作しますので、ぜひ試してみてください。


1. 日次レポートの自動生成

毎日のデータを集計し、レポートシートに自動出力するスクリプトです。


function generateDailyReport() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName('売上データ');
  const reportSheet = ss.getSheetByName('日次レポート');

  // 今日の日付を取得
  const today = new Date();
  const todayStr = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd');

  // 売上データを取得(A列:日付, B列:商品名, C列:金額)
  const data = dataSheet.getDataRange().getValues();

  // 今日のデータだけフィルタリング
  let todayTotal = 0;
  let todayCount = 0;

  for (let i = 1; i < data.length; i++) {  // 1行目はヘッダーなのでスキップ
    const rowDate = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
    if (rowDate === todayStr) {
      todayTotal += data[i][2];  // 金額を加算
      todayCount++;
    }
  }

  // レポートシートに書き込み
  const lastRow = reportSheet.getLastRow() + 1;
  reportSheet.getRange(lastRow, 1, 1, 3).setValues([
    [todayStr, todayCount, todayTotal]
  ]);

  console.log(`${todayStr}のレポートを生成しました: ${todayCount}件, ${todayTotal}円`);
}

使い方:

  • 「売上データ」シートを作成(A列:日付, B列:商品名, C列:金額)
  • 「日次レポート」シートを作成
  • スクリプトを実行

2. フォーム回答の自動集計

Googleフォームの回答を自動で集計するスクリプトです。


function aggregateFormResponses() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const responseSheet = ss.getSheetByName('フォームの回答 1');
  const summarySheet = ss.getSheetByName('集計');

  // 回答データを取得(1行目はヘッダー)
  const data = responseSheet.getDataRange().getValues();
  const headers = data[0];

  // 各質問の回答を集計(例: 2列目の回答を集計)
  const targetColumn = 1;  // 集計したい列(0始まり)
  const counts = {};

  for (let i = 1; i < data.length; i++) {
    const answer = data[i][targetColumn];
    counts[answer] = (counts[answer] || 0) + 1;
  }

  // 集計結果を書き込み
  summarySheet.clear();
  summarySheet.getRange(1, 1, 1, 2).setValues([['回答', '件数']]);

  let row = 2;
  for (const [answer, count] of Object.entries(counts)) {
    summarySheet.getRange(row, 1, 1, 2).setValues([[answer, count]]);
    row++;
  }

  console.log('集計が完了しました');
}

ポイント: Googleフォームの回答は自動的にスプレッドシートに記録されます。そのシート名は通常「フォームの回答 1」です。


3. メール送信の自動化

スプレッドシートのデータを使って自動でメールを送信します。


function sendAutomaticEmails() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('送信リスト');

  // データ取得(A列:メールアドレス, B列:名前, C列:送信済みフラグ)
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    const email = data[i][0];
    const name = data[i][1];
    const sent = data[i][2];

    // 既に送信済みならスキップ
    if (sent === '送信済み') continue;

    // メール本文を作成
    const subject = '【お知らせ】今月のレポートのご案内';
    const body = `${name} 様

いつもお世話になっております。
今月のレポートが完成しましたので、ご確認ください。

何かご不明点がございましたら、お気軽にお問い合わせください。

よろしくお願いいたします。`;

    // メール送信
    GmailApp.sendEmail(email, subject, body);

    // 送信済みフラグを立てる
    sheet.getRange(i + 1, 3).setValue('送信済み');

    console.log(`送信完了: ${email}`);
  }
}

注意: GmailAppを使用するには、初回実行時にGmailへのアクセス許可が必要です。また、1日の送信上限(無料アカウントは100通/日)があります。


4. 定期バックアップ

スプレッドシートを定期的にバックアップするスクリプトです。


function backupSpreadsheet() {
  // バックアップ元のスプレッドシート
  const sourceId = SpreadsheetApp.getActiveSpreadsheet().getId();
  const sourceFile = DriveApp.getFileById(sourceId);

  // バックアップ先フォルダのID(Googleドライブのフォルダを指定)
  // フォルダのURLから取得: https://drive.google.com/drive/folders/XXXXX ← このXXXXX部分
  const backupFolderId = 'YOUR_FOLDER_ID_HERE';  // ← 実際のフォルダIDに置き換えてください
  const backupFolder = DriveApp.getFolderById(backupFolderId);

  // バックアップファイル名(日付入り)
  const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd_HHmmss');
  const backupName = `backup_${sourceFile.getName()}_${today}`;

  // コピーを作成
  sourceFile.makeCopy(backupName, backupFolder);

  console.log(`バックアップ完了: ${backupName}`);
}

設定手順:

  • Googleドライブにバックアップ用フォルダを作成
  • フォルダのURLからIDをコピー
  • YOUR_FOLDER_ID_HEREを実際のIDに置き換え

5. Slack通知連携

スプレッドシートの更新をSlackに通知します。


function sendSlackNotification() {
  // SlackのWebhook URL(Slack Appから取得)
  const webhookUrl = 'YOUR_SLACK_WEBHOOK_URL';  // ← 実際のURLに置き換えてください

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('タスク管理');

  // 未完了タスクをカウント
  const data = sheet.getDataRange().getValues();
  let pendingCount = 0;

  for (let i = 1; i < data.length; i++) {
    if (data[i][2] !== '完了') {  // C列がステータスと仮定
      pendingCount++;
    }
  }

  // Slackに送信するメッセージ
  const message = {
    text: `📊 *タスク管理レポート*\n未完了タスク: ${pendingCount}件\n<${ss.getUrl()}|スプレッドシートを開く>`
  };

  // HTTP POSTリクエストを送信
  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(message)
  };

  UrlFetchApp.fetch(webhookUrl, options);

  console.log('Slack通知を送信しました');
}

Webhook URLの取得方法:

  • Slackの「App」から「Incoming Webhooks」を追加
  • 通知先チャンネルを選択
  • 発行されるWebhook URLをコピー

トリガー設定で完全自動化

ここまでのスクリプトは、手動で「実行」ボタンを押す必要がありました。トリガーを設定すれば、指定した時間や条件で自動実行できます。

トリガーの種類

トリガー種類 説明 使用例
時間主導型 指定した間隔で実行 毎日9時にレポート生成
スプレッドシートから 編集時やフォーム送信時に実行 新規回答があったら集計
カレンダーから イベント更新時に実行 予定変更をSlack通知

トリガーの設定手順

手順1:トリガー画面を開く

GASエディタの左メニューから「トリガー」(時計アイコン)をクリックします。

[画像: GASエディタのトリガーメニュー]

手順2:トリガーを追加

右下の「+ トリガーを追加」ボタンをクリックします。

手順3:設定を入力

例として、毎日午前9時にgenerateDailyReportを実行する設定:

設定項目
実行する関数 generateDailyReport
イベントのソース 時間主導型
時間ベースのトリガータイプ 日付ベースのタイマー
時刻を選択 午前9時〜10時

[画像: トリガー設定画面]

手順4:保存

「保存」をクリックすれば設定完了です。

トリガー利用時の注意点

  • 実行時間の誤差: 指定した時間の前後15分程度で実行されます
  • 実行制限: 無料アカウントは1日90分まで(有料のWorkspaceは6時間)
  • エラー通知: 実行エラーが発生するとメールで通知されます

よくあるエラーと解決法

GASを使っていると、いくつかのエラーに遭遇することがあります。代表的なものと解決方法を紹介します。

エラー1:「権限がありません」

原因: スクリプトが初めてGoogleサービスにアクセスしようとしている

解決法:

  • 「権限を確認」をクリック
  • Googleアカウントを選択
  • 「詳細」→「〇〇(安全ではないページ)に移動」をクリック
  • 「許可」をクリック

[画像: 権限の承認画面]

エラー2:「範囲のサイズが一致しません」

原因: setValues()で指定した範囲と、データの配列サイズが異なる

解決法:


// ❌ 間違い: 範囲とデータサイズが不一致
sheet.getRange('A1:C3').setValues([[1, 2]]);  // 2列のデータを3列の範囲に入れようとしている

// ✅ 正しい: 動的に範囲を指定
const data = [[1, 2], [3, 4]];
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);

エラー3:「1日の実行時間を超えました」

原因: 無料アカウントの実行上限(90分/日)に達した

解決法:

  • 処理を最適化する(getValueよりgetValuesを使う)
  • 不要なトリガーを削除する
  • Google Workspaceアカウントへのアップグレードを検討

エラー4:「サービスがタイムアウトしました」

原因: 1回の実行が6分(360秒)を超えた

解決法:

  • 処理を分割する
  • バッチ処理を導入する(100件ずつ処理など)

// バッチ処理の例
function processBatch() {
  const BATCH_SIZE = 100;
  const properties = PropertiesService.getScriptProperties();
  let startRow = parseInt(properties.getProperty('startRow') || '1');

  // 100件処理
  // ... 処理ロジック ...

  // 次の開始位置を保存
  properties.setProperty('startRow', String(startRow + BATCH_SIZE));
}

まとめ・次のステップ

この記事では、GASを使ったスプレッドシート自動化の基本から実践テクニックまでを解説しました。

この記事のポイント

GASはJavaScriptベースで初心者にも学びやすい

セルの読み書きはgetValue/getValuessetValue/setValuesが基本

実務で使える5つの自動化パターンを紹介

  • 日次レポート自動生成
  • フォーム回答の自動集計
  • メール送信の自動化
  • 定期バックアップ
  • Slack通知連携

トリガーを使えば完全自動化が可能

次のステップ

GASの基本を理解したら、次は以下のトピックに挑戦してみましょう。

  • Gmail連携を深掘り: メールの自動振り分け、定型文の自動返信
  • Googleカレンダー連携: スケジュールとスプレッドシートの同期
  • 外部API連携: ChatGPT、LINE、各種Webサービスとの連携
  • Webアプリ化: GASでシンプルなWebアプリケーションを作成

おすすめ学習リソース:

最初は小さな自動化から始めて、徐々にスキルアップしていきましょう。毎月の手作業が数時間減るだけでも、年間では大きな効果になります。


この記事が役に立ったら、ぜひブックマークしてお使いください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次