【GAS×生成AI】非エンジニアが実際に開発してみた!スプシで簡単自動化(その1)

  • このエントリーをはてなブックマークに追加
【GAS×生成AI】非エンジニアが実際に開発してみた!スプシで簡単自動化

「毎日の単純作業やデータ整理をもっと効率化したい」「自動化に興味はあるけれど、プログラミングなんて書いたことがないから無理…」とあきらめていませんか?

Googleスプレッドシートなどの操作を自動化できる「Google Apps Script(GAS)」は、業務効率化の強力なツールです。そして今、生成AIの登場によって、プログラミング知識がない非エンジニアでも簡単にコードを作成し、業務を自動化できるようになりました。

この記事では、非エンジニアの方向けにGASの基本的な使い方から、生成AI(Gemini)を活用して実際に業務効率化ツールを作成・実行してみたプロセスと結果までをわかりやすく解説します。

GAS×生成AI】で非エンジニアでも開発が可能になった

これまで「自動化する」というと、プログラミング言語の文法を勉強したり、エラーが出たら自力で調べて解決したりする必要があり、非エンジニアにとっては非常にハードルが高いものでした。

しかし、生成AIの登場によってその状況は一変しました。

現在では、やりたいこと(「毎月の売り上げを集計したい」「指定の条件でデータを振り分けたい」など)を自然な日本語でAIに相談するだけで、必要なスクリプトを自動作成してくれます。さらに、コードだけでなく「どの画面を開いてどこに貼り付ければいいのか」という具体的な作業手順まで丁寧に解説してくれます。

つまり、専門的なプログラミング知識がなくても、「AIに頼むコツ」さえ掴めば、誰でも簡単に業務自動化ツールを開発できる時代になったのです。

詳しくはこちらの記事もご覧ください。
GASが注目される理由とは?非エンジニアでもできる業務の自動化

GASの基本的な使い方

まずは、GASを始めるための基本的な操作手順を押さえておきましょう。特別なソフトをインストールする必要はなく、ブラウザとGoogleアカウントがあればすぐに始められます。

Googleアカウントの確認

GASを利用するにはGoogleアカウントが必要です。すでにお持ちのGmailアカウントや、職場・学校で利用しているGoogle Workspaceアカウントにログインしていることを確認してください。

スプレッドシートを開く

自動化したい(または動作をテストしたい)Googleスプレッドシートを開くか、新規でスプレッドシートを作成します。

Apps Scriptを開く

スプレッドシートの上部メニューにある「拡張機能」をクリックし、表示されたメニューの中から「Apps Script」を選択します。すると、新しいタブでGASのエディタ画面が開きます。

プログラム名の変更

エディタ画面の左上にある「無題のプロジェクト」と書かれた部分をクリックすると、プロジェクト名(プログラム名)を変更できます。後から見返したときに何のプログラムかわかりやすい名前(例:「空白行削除ツール」など)に変更しておきましょう。

コードの記述と保存

画面中央のエディタエリアに、実行したいスクリプト(プログラム)を入力します。不要な初期コード(function myFunction() {}など)があれば消去し、必要なコードを貼り付けます。コードの記述が終わったら、画面上部にある「セーブ(フロッピーディスクのアイコン)」をクリックして保存します。

スクリプトの実行

保存が完了したら、上部の「実行」ボタンをクリックします。

初めて実行する時の注意点(承認と許可)

初めてスクリプトを実行する際、1回だけアカウントへのアクセス承認と許可を求められるセキュリティ画面が表示されます。以下の手順で許可を完了させてください。

  1. 「承認が必要です」というポップアップが出たら「権限を確認」をクリックします。
  2. アカウントの選択画面で、利用中のGoogleアカウントを選択します。
  3. 「このアプリは Google で確認されていません」という警告画面が出たら、左下にある「詳細」をクリックします。
  4. 下部に表示される「〇〇(安全ではないページ)に移動」をクリックします。
  5. アクセス権限の確認画面が表示されたら、右下の「許可」をクリックします。

これで設定は完了です。2回目以降の実行時にはこの操作は不要になります。

【GAS×生成AI】1列ごと空列を追加する

ここからは、実際に生成AI(Gemini)を活用して業務に役立つスクリプトを作成・実行してみた例をご紹介します。

まずは、データとデータの間に1列ずつ空白の列を挟む作業の自動化です。

生成AI(gemini)に相談

1列ごと空列を追加したいです。gasで行う手順を教えてください。コードも作成してください。

生成AI(gemini)からの回答

手順

  1. スプレッドシートを開き、上部メニューの 「拡張機能」 > 「Apps Script」 をクリックします。
  2. エディタが開くので、既存のコード(function myFunction() {…})を消し、下のサンプルコードを貼り付けます。
  3. 保存アイコン(フロッピーディスクのマーク)を押すか、Ctrl + S(Macは Cmd + S)で保存します。
  4. 上部の実行ボタンの横にある関数選択で insertEmptyColumnsEveryOther を選び、「実行」 をクリックします。
  5. 初回実行時のみ「承認が必要です」というダイアログが出るので、画面の指示に従ってアクセスを許可してください。

コード

/**
 * アクティブなシートの各列の右隣に1列ずつ空列を挿入するスクリプト
 */
function insertEmptyColumnsEveryOther() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastColumn = sheet.getLastColumn();
  
  // データが存在しない場合は処理を終了
  if (lastColumn === 0) {
    Logger.log("データが存在しません。");
    return;
  }
  
  // 列のインデックスがずれないよう、最後の列から逆順(右から左)に挿入を実行
  for (let col = lastColumn; col >= 1; col--) {
    sheet.insertColumnAfter(col);
  }
}

実際の結果

ご覧のように空列が挿入されました。

手作業で1列ずつ「右に1列挿入」を繰り返すのは大変な手間ですが、GASを使えば一瞬で全体に空列を追加できます。データ整理の事前準備などで非常に役立ちます。

【GAS×生成AI】空白行を削除するボタンを作る

続いて、データシート内にある不要な空白行を一括で削除し、さらにその処理を「ボタン1つ」で呼び出せるように設定してみます。

生成AI(gemini)に相談

空白行を削除するボタンを作成したいです。gasで行う手順を教えてください。コードも作成してください。

生成AI(gemini)からの回答

手順

  1. GASコードの準備
    1. スプレッドシートを開き、上部メニューの 「拡張機能」 > 「Apps Script」 をクリックします。
    2. もともと入っている function myFunction() {…} を消去し、以下のコードを貼り付けます。
    3. 上部の 保存アイコン(フロッピーディスク) をクリックします。
  2. スプレッドシート上にボタンを作成する
    コードの準備ができたら、シート上にボタンを設置して関数を割り当てます。
    1. 図形描画を開く:スプレッドシートのメニューから 「挿入」 > 「描画」 をクリックします。
    2. ボタンのデザインを作る:「図形」アイコンからお好みの図形(「角丸長方形」などがおすすめ)を選んで描き、テキストで「空白行を削除」などと入力して保存します。
    3. スクリプトを割り当てる:シート上に配置されたボタン(図形)の 右上にある「⋮」(3つの点) をクリックし、「スクリプトを割り当て」 を選択します。
    4. 関数名を入力する:入力欄に deleteEmptyRows と入力し、「OK」 をクリックします。

ポイント
行を削除するときは「下の行から順番に(逆順で)」処理を行うのが基本です。上から削除すると、削除された分だけ下の行の番号がずれて正しく判定できなくなるためです。

コード

/**
 * 選択中のシートから空白行を一括削除する関数
 */
function deleteEmptyRows() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = sheet.getDataRange();
  const values = range.getValues();
  const maxRows = sheet.getMaxRows();
  
  // 後ろの行から順番にチェックして削除(行番号のズレを防ぐため)
  let deletedCount = 0;
  for (let i = values.length - 1; i >= 0; i--) {
    // 行内のすべてのセルが空(空白または半角・全角スペースのみ)か判定
    const isEmpty = values[i].every(cell => cell.toString().trim() === "");
    
    if (isEmpty) {
      sheet.deleteRow(i + 1); // シートの行番号は1始まり
      deletedCount++;
    }
  }
  
  // 処理結果をトースト通知(シート右下の通知)
  if (deletedCount > 0) {
    SpreadsheetApp.getActiveSpreadsheet().toast(`${deletedCount} 行の空白行を削除しました。`, "完了");
  } else {
    SpreadsheetApp.getActiveSpreadsheet().toast("削除対象の空白行はありませんでした。", "完了");
  }
}

実際の結果

ご覧のように空行が削除されました。

さらに、スプレッドシート上に挿入した図形(ボタン)にスクリプトを割り当てることで、わざわざGASのエディタ画面を開かなくても、シート上のボタンを押すだけで一括削除が完了するようになります。プログラミングに慣れていないチームメンバーに共有する際にも非常に便利な仕組みです。

【GAS×生成AI】社員をランダムでグルーピング

最後に、少し複雑な条件を指定した実務的なプログラムに挑戦してみます。社員名簿のデータから、役職や部署の偏りを防ぎつつランダムにグループ分けを行うツールです。

生成AI(gemini)に相談

A列に社員番号、B列に氏名、C列に部署、D列に役職、E列にメールアドレス、F列に乳年月日が記載された社員名簿があります。
社員名簿から以下の条件でグループを作りたいです。
gasで行う手順を教えてください。コードも作成してください。

  • 1グループ4~6人
  • 役職者をなるべく均等にする
  • グループにはなるべくいろいろな部署の人を入れたい

生成AI(gemini)からの回答

処理の考え方

  1. 役職者の分散: 「役職」が入力されている人を優先的に各グループへ1人ずつ均等に振り分けます。
  2. 部署の多様化: 各グループにメンバーを追加する際、「まだそのグループにいない部署の人」を優先して選出します。
  3. 人数制御: 1グループ当たり4〜6人になるよう、全体の人数に応じて最適なグループ数を自動計算します。

手順

  1. GASの編集画面を開く
    Googleスプレッドシートを開き、メニューの 「拡張機能」 > 「Apps Script」 をクリックします。
  2. コードの貼り付けと保存
    表示されたエディタ内のコードをすべて消去し、上記のコードをそのまま貼り付けて 「プロジェクトを保存(フロッピーディスクのマーク)」 をクリックします。
  3. スクリプトを実行する
    対象の社員名簿があるシート画面を開いておきます。Apps Script画面の上部メニューで createBalancedGroups が選択されていることを確認し、「実行」 をクリックします。※初回実行時のみ「承認が必要です」という画面が出るので、指示に従って権限を許可してください。
  4. 結果の確認
    実行が完了すると、自動的に 「グループ分け結果」 という新しいシートが作成され、均等に振り分けられたリストが出力されます。

補足・ポイント
役職者の判定: D列(役職)に文字が入っている人を「役職者」として判定しています。再実行: 実行するたびにシャッフルされるため、気に入った編成になるまで何度でも再実行(グループの再生成)が可能です。

コード

/**
 * 社員名簿から役職と部署を考慮してグループを作成する関数
 */
function createBalancedGroups() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet(); // 現在開いているシート
  
  // 1. データの取得(ヘッダーを除く2行目以降)
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) {
    Browser.msgBox("データが存在しません。");
    return;
  }
  
  // A列〜F列のデータを取得
  const data = sheet.getRange(2, 1, lastRow - 1, 6).getValues();
  
  // 社員オブジェクトのリストを作成
  let employees = data.map((row, index) => {
    return {
      id: row[0],      // 社員番号
      name: row[1],    // 氏名
      dept: row[2],    // 部署
      title: row[3],   // 役職
      email: row[4],   // メールアドレス
      birth: row[5],   // 生年月日
      isLeader: row[3] && row[3].toString().trim() !== "" // 役職があるか判断
    };
  });

  const totalEmployees = employees.length;
  if (totalEmployees === 0) return;

  // 2. グループ数の計算 (1グループ4〜6人)
  // 基本的に5人を目指しつつ、4〜6人に収まるグループ数を算出
  let numGroups = Math.round(totalEmployees / 5);
  if (numGroups === 0) numGroups = 1;
  
  // 1グループあたり最低4人、最高6人の範囲に収まるよう調整
  while (totalEmployees / numGroups > 6) {
    numGroups++;
  }
  while (totalEmployees / numGroups < 4 && numGroups > 1) {
    numGroups--;
  }

  // 空のグループ配列を作成
  let groups = Array.from({ length: numGroups }, () => []);

  // データをシャッフルして毎回異なる結果になるようにする
  employees = shuffleArray(employees);

  // 3. 役職者を分散配置
  const leaders = employees.filter(e => e.isLeader);
  const nonLeaders = employees.filter(e => !e.isLeader);

  // 役職者をラウンドロビン方式でグループに割り当て
  leaders.forEach((leader, index) => {
    groups[index % numGroups].push(leader);
  });

  // 4. 一般社員を部署が被らないように割り当て
  nonLeaders.forEach(emp => {
    // まだ空きがあるグループ(最大6人未満)の中から探す
    let availableGroups = groups.filter(g => g.length < 6);

    // その中でも一番人数が少ないグループを優先
    let minSize = Math.min(...availableGroups.map(g => g.length));
    let targetGroups = availableGroups.filter(g => g.length === minSize);

    // 同一部署の人が最も少ないグループを選択
    let bestGroup = targetGroups[0];
    let minDeptCount = Infinity;

    targetGroups.forEach(g => {
      const sameDeptCount = g.filter(m => m.dept === emp.dept).length;
      if (sameDeptCount < minDeptCount) {
        minDeptCount = sameDeptCount;
        bestGroup = g;
      }
    });

    bestGroup.push(emp);
  });

  // 5. 結果を新しいシートに出力
  outputResults(ss, groups);
}

/**
 * 配列をランダムにシャッフルする関数(フィッシャー–イェーツのシャッフル)
 */
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

/**
 * 結果を「グループ分け結果」シートに出力する関数
 */
function outputResults(ss, groups) {
  let resultSheet = ss.getSheetByName("グループ分け結果");
  
  // 既に結果シートがあれば削除して新規作成
  if (resultSheet) {
    ss.deleteSheet(resultSheet);
  }
  resultSheet = ss.insertSheet("グループ分け結果");

  // ヘッダーの書き込み
  const headers = ["グループ名", "社員番号", "氏名", "部署", "役職", "メールアドレス", "生年月日"];
  resultSheet.getRange(1, 1, 1, headers.length).setValues([headers])
             .setBackground("#4a86e8")
             .setFontColor("#ffffff")
             .setFontWeight("bold");

  const rows = [];
  groups.forEach((group, index) => {
    const groupName = `グループ ${index + 1}`;
    group.forEach(emp => {
      rows.push([
        groupName,
        emp.id,
        emp.name,
        emp.dept,
        emp.title,
        emp.email,
        emp.birth
      ]);
    });
  });

  // データの書き込み
  if (rows.length > 0) {
    resultSheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
    resultSheet.autoResizeColumns(1, headers.length);
  }

  Browser.msgBox("グループ分けが完了しました!「グループ分け結果」シートをご確認ください。");
}

実際の結果

ご覧のように新しいシート 「グループ分け結果」 に6つのグループわけが出来ました。役職者や部署もばらけています。

複雑なロジックが必要な条件分岐やランダム処理も、AIに条件を正しく伝えることで、人間が手作業で組むと膨大な時間がかかるグループ分けを一瞬で精度高く実行できるようになりました。社内イベントやシャッフルランチなどにそのまま活用できます。

まとめ:まずは簡単な動作でGASを体験してみましょう

今回は、生成AI(Gemini)を活用して、非エンジニアでも簡単にGASを使った業務自動化を実現する方法をご紹介しました。

コードを一から書く必要がなくなり、やりたいことを言語化してAIに指示を出すだけで、誰でも業務の効率化・自動化に取り組める時代になりました。

まずは「1列おきに空白を入れる」「簡単な計算を自動化する」といった小さな操作から体験してみてください。一度仕組みを理解すれば、日々のデスクワークの負担を大きく減らすことができるはずです。ぜひ今日からGAS×生成AIのパワーを実感してみましょう!

社内のITサポートのことならプロにお任せ!セキュリティ対策やAI活用も「ITボランチ」

IT人材にお困りならボンズテックにご相談ください!適切な人材をご紹介します

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。