現在、情報を随時更新中です。
ツールの使い方

【実例で解説】生成AI×ICT業務|私が仕事を爆速化した超実践テクニック8選+Slack自動化

to.igarashi@nekonote-design.info
IGA
IGA

「業務のムダ、まだ抱えていませんか?AIと自動化で“人じゃなくていい仕事”を全部任せています!」

ICT推進担当として、会議運営/IT導入/採用広報/現場支援 など幅広く対応してきました。その中で、生成AIと自動化ツールを活用することで 業務時間を最大1/6まで短縮することができました。

この記事では、私が実際の仕事で使っている すぐに真似できる活用術をご紹介します!

会議議事録の自動化

IGA
IGA

議事録恐怖症から卒業しました!
今までは必死に会議を聞きながら全文を手打ちしていて、会議の内容が半分も入りませんでした。

使用ツール

Notta / ChatGPT /Zoom

▼操作手順(完全自動化ルーティン)

Zoom録画とNottaの自動連係

Zoomを開始したら、録画を許可する⇒Nottaを開いてWeb会議の招待URLを入れて、文字起こしをするにチェックする。

※ZoomアカウントとNottaアカウントを連携させると、これをしなくても自動で入出してくれるようになる。ただし、Zoom会議を1時間ぐらい前に予約しておく必要があります。

発言を出力する。

Nottaを開いて、すべてのノートから該当の会議のノートを開き、ダウンロードする。

基本的には、下記のオプションにチェックが入っていれば問題ありません。

ChatGPTに貼り付け

下記の、プロンプトを参照してください。

ChatGPTにPDFかWordで出力してもらう。

出力したデータがバグっているときがある場合は⇒「文字がバグっているもう一度出力して下さい」とお願いしてください。

そもそも出力データが出てこない場合⇒ローマ字表記のファイル名に指定する。例えば、「20250104seisankaigi.pdfのファイル名で出力してください」とお願いすると出力できます。

▼プロンプト例(貼るだけ)

プロンプトを貼り付け+文字起こししたファイルを添付して、ChatGPTへお願いします。
以下は定例会議の議事録を作成するための文字起こしです。この内容に基づき、次のフォーマットで議事録を作成してください。

【会議概要】
- 会議名:◯◯◯◯
- 日時:2025年◯月◯日(◯)◯◯:◯◯〜◯◯:◯◯
- 出席者:◯◯、◯◯、◯◯(敬称略)

【決定事項】
- 会議で正式に決定された内容を箇条書きで記載してください。
- 関係者の認識が揃うよう、具体的かつ明確に書いてください。

【アクションアイテム(ToDo)】
- 誰が/何を/いつまでに行うのかを記載してください。
例)「山田が報告書のドラフトを4月18日(金)までに作成」

【未決事項・保留項目】
- 今後の検討が必要なテーマや、決定が持ち越された内容を記載してください。

【リスク・課題】
- 現時点での課題やリスク、またそれに対する対策案があれば記載してください。

【次回議題(予定)】
- 次回の会議で議論するべきテーマを簡潔にリストアップしてください。

【発言要約(発言者別)】
- 重要な発言や提案を、発言者ごとに要約してください。

【会議終了時刻と次回会議】
- 終了時刻:◯◯:◯◯
- 次回会議日時:未定/◯月◯日(◯)◯◯:◯◯〜◯◯:◯◯

【チャプター】
- 会議全体をチャプターに分け、各章の要点やテーマを小見出し付きで記述してください。
- 各チャプターは「# Chapter 1:〇〇〇〇」のように記載し、内容のまとまりが視覚的に分かるようにしてください。

必要に応じてチェックリスト形式やタグ付け(例:#人事 #IT #予算)も活用してください。

✔効果

BeforeAfter
2〜3時間30分以内
手間とストレス大精度高い議事録が即完成

AIと一緒にGASを開発

IGA
IGA

コードはAIと会話して作ります!

▼実装例

  • CSV → XLSX変換
  • Accessテーブルへ自動取込
  • Finishフォルダへ自動移動

▼依頼文テンプレ

このGASを修正してください。
・フォルダ「import」のCSV対象
・xlsxへ変換
・処理済は「Finish」へ移動
・ログ出力

✔効果

  • 外注コストなし
  • 修正も改善も自分で可能に!

WordPressでデザイン時短

IGA
IGA

CSS不要で”いい感じ”にできる!

▼実例:画像の上にボタン重ねる

  1. WordPressで画像配置
  2. ボタンをドラッグで重ねる(重ならないことが多い)
  3. 重ならない場合はCSSをAIに依頼

▼プロンプト例

レスポンシブ対応で、画像にボタンを重ねるCSSを作成してください。
スマホ表示時の位置自動調整も。
(この時に、今カスタムCSSへ記入されている全文を追加で入力する必要と追加CSSクラスで等、細かい指示があるといい)

✔成果

  • LP制作が高速化
  • 手戻りなし

SNS(採用広報)の文章改善

IGA
IGA

伝わる言葉はAIが一番得意!

▼テンプレ

[採用のターゲット][募集職種][法人の強み]⇒かっこの中身を変更して必ず入れて下さい。

求職者向けの訴求文章に改善してください。
・強い見出し
・短く明確に
・応募導線を明確に
・絵文字適量

✔効果

  • 反応率改善
  • 投稿頻度維持できる

提案資料ドラフト自動生成(Gamma)

IGA
IGA

ゼロ→イチが秒速で形になる!

▼使い方ルール

ChatGPT

全体の構成ながら、マインドマップを作る要領でどんどん文章を追加していき、最後にスライドにするのでスライド用の文章を出してくださいとお願いする。

Gamma

スライド用の文章を貼り付けて、Gammaでスライド作成を自動で行う。

PowerPoint

GammaデータをPowerPointで出力するときにレイアウト構成が崩れるときがあるので、修正を行う。
PDFで出力するときはその心配がないので、プレゼンでパワポ動作を付けないときは、PDF出力で十分。

▼プロンプト例

採用コミュニケーション改善提案書の構成を10ページで作ってください。
課題→解決策→導入→費用→スケジュール
スライド向け短文で。

✔効果

  • 初稿10分
  • デザイン統一
  • 説得力が強くなる

「AIと人間の合作がちょうどいい!」

Slack → シート自動転記ツール

IGA
IGA

「Slackに書けば記録完了!」

▼使った技術

Slack API / GAS / ChatGPT

▼依頼文

Slackの指定チャンネルの内容を
Googleスプレッドに転記してください。
・ユーザー名、本文、日時
・最新50件
・末尾に追記
・日本時間で表示
Slackの指定チャンネルの内容を
Googleスプレッドに転記してください。
・ユーザー名、本文、日時
・最新50件
・末尾に追記
・日本時間で表示

✔実際のGAS(チャッピーで解析すれば設定方法わかります)

function updateSlackChatHistory() {
  const properties = PropertiesService.getScriptProperties();
  const startTime = new Date().getTime(); // 実行開始時刻
  const spreadsheetFolderID = properties.getProperty("SpreadsheetFolderID");
  const attachmentFolderID = properties.getProperty("AttachmentFolderID");

  const listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("管理リスト");
  const logSheet = getOrCreateSheet("ログ");
  const slackHeaders = ["client_msg_id", "type", "text", "user", "ts", "reply_count", "reply_users_count", "is_thread", "attachments"];

  // 保存された進捗を取得
  let progress = JSON.parse(properties.getProperty("progress") || "{}");
  let currentIndex = progress.index || 0;
  let nextCursor = progress.nextCursor || null;
  let lastTimestamp = progress.lastTimestamp || 0;

  const data = listSheet.getDataRange().getValues();
  const headers = data.shift(); // ヘッダーを除外

  for (let i = currentIndex; i < data.length; i++) {
    const [OAuthAccessToken, channelID, spreadsheetID, updateFlag, slackName] = data[i];

    if (updateFlag !== true && updateFlag !== "更新") continue;

    appendLog(logSheet, `開始: チャンネル名=${slackName}, 行番号=${i + 2}, スプレッドシートID=${spreadsheetID || "新規作成"}`);

    let targetSpreadsheet;
    if (!spreadsheetID) {
      targetSpreadsheet = SpreadsheetApp.create("Slack_" + slackName);
      const newSpreadsheetID = targetSpreadsheet.getId();
      moveFileToFolder(newSpreadsheetID, spreadsheetFolderID);
      listSheet.getRange(i + 2, 3).setValue(newSpreadsheetID);
      appendLog(logSheet, `新しいスプレッドシートを作成しました: ${slackName} (ID: ${newSpreadsheetID})`);
    } else {
      targetSpreadsheet = SpreadsheetApp.openById(spreadsheetID);
    }

    let targetSheet = targetSpreadsheet.getSheetByName(slackName);
    if (!targetSheet) {
      targetSheet = targetSpreadsheet.insertSheet(slackName);
      targetSheet.getRange(1, 1, 1, slackHeaders.length).setValues([slackHeaders]);
    }

    if (!lastTimestamp) {
      const lastRow = targetSheet.getLastRow();
      lastTimestamp = lastRow >= 2 ? targetSheet.getRange(lastRow, 5).getValue() : 0;
    }

    const { messages, nextCursor: newCursor } = fetchSlackMessagesWithPagination(
      OAuthAccessToken,
      channelID,
      lastTimestamp,
      attachmentFolderID,
      nextCursor
    );

    if (messages.length > 0) {
      const lastRow = targetSheet.getLastRow();
      targetSheet.getRange(lastRow + 1, 1, messages.length, messages[0].length).setValues(messages);
      appendLog(logSheet, `データを追加しました: ${slackName} (件数: ${messages.length})`);
    }

    // 進捗を保存
    properties.setProperty(
      "progress",
      JSON.stringify({ index: i, nextCursor: newCursor, lastTimestamp })
    );

    if (new Date().getTime() - startTime > 300000) {
      appendLog(logSheet, `処理がタイムアウトしました。進捗を保存して終了します: ${slackName}`);
      return;
    }

    nextCursor = null;
    lastTimestamp = 0;

    appendLog(logSheet, `終了: チャンネル名=${slackName}, 行番号=${i + 2}`);
  }

  properties.deleteProperty("progress");
  appendLog(logSheet, "すべてのチャンネルの処理が完了しました。");
}

function fetchSlackMessagesWithPagination(OAuthAccessToken, channelID, lastTimestamp, attachmentFolderID, cursor = null) {
  const fetchUrl = `https://slack.com/api/conversations.history?channel=${channelID}&limit=100${cursor ? `&cursor=${cursor}` : ""}`;
  const messages = [];
  let nextCursor = null;

  const res = makeSlackApiRequest(fetchUrl, OAuthAccessToken);

  if (res.messages) {
    res.messages.reverse().forEach((msg) => {
      if (parseFloat(msg.ts) <= lastTimestamp) return;

      const attachments = msg.files ? saveAttachments(msg.files, attachmentFolderID, OAuthAccessToken) : [];
      messages.push([
        msg.client_msg_id || "",
        msg.type || "",
        msg.text || "",
        msg.user || "",
        msg.ts || "",
        msg.reply_count || 0,
        msg.reply_users_count || 0,
        false,
        attachments.join(", ")
      ]);

      if (msg.thread_ts) {
        const threadMessages = fetchThreadMessages(OAuthAccessToken, channelID, msg.thread_ts, attachmentFolderID);
        messages.push(...threadMessages);
      }
    });

    nextCursor = res.response_metadata ? res.response_metadata.next_cursor : null;
  }

  return { messages, nextCursor };
}

function makeSlackApiRequest(url, OAuthAccessToken) {
  const options = {
    headers: { Authorization: `Bearer ${OAuthAccessToken}` },
    muteHttpExceptions: true
  };

  let response;
  let retryCount = 0;

  while (retryCount < 5) {
    response = UrlFetchApp.fetch(url, options);
    const statusCode = response.getResponseCode();

    if (statusCode === 429) {
      const retryAfter = parseInt(response.getHeaders()["Retry-After"], 10) || 1;
      Utilities.sleep(retryAfter * 1000);
      retryCount++;
    } else if (statusCode >= 200 && statusCode < 300) {
      return JSON.parse(response.getContentText());
    } else {
      throw new Error(`Slack API error: ${response.getContentText()}`);
    }
  }

  throw new Error("Failed to fetch data from Slack API after multiple retries.");
}

function fetchThreadMessages(OAuthAccessToken, channelID, threadTs, attachmentFolderID) {
  const fetchUrl = `https://slack.com/api/conversations.replies?channel=${channelID}&ts=${threadTs}`;
  const res = makeSlackApiRequest(fetchUrl, OAuthAccessToken);
  const threadMessages = [];

  if (res.messages) {
    res.messages.reverse().forEach((msg) => {
      const attachments = msg.files ? saveAttachments(msg.files, attachmentFolderID, OAuthAccessToken) : [];
      threadMessages.push([
        msg.client_msg_id || "",
        msg.type || "",
        msg.text || "",
        msg.user || "",
        msg.ts || "",
        0,
        0,
        true,
        attachments.join(", ")
      ]);
    });
  }

  return threadMessages;
}

function saveAttachments(files, folderID, OAuthAccessToken) {
  const folder = DriveApp.getFolderById(folderID);
  const savedFiles = [];

  files.forEach((file) => {
    if (!file.url_private) return;

    try {
      const existingFile = folder.getFilesByName(file.name);
      if (existingFile.hasNext()) {
        savedFiles.push(file.name);
        return;
      }

      const response = UrlFetchApp.fetch(file.url_private, {
        headers: { Authorization: `Bearer ${OAuthAccessToken}` }
      });
      const blob = response.getBlob();
      const savedFile = folder.createFile(blob.setName(file.name || "unknown_file"));
      savedFiles.push(savedFile.getName());
    } catch (e) {
      Logger.log(`Error downloading file: ${e.message}`);
    }
  });

  return savedFiles;
}

function getOrCreateSheet(sheetName) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  }
  return sheet;
}

function appendLog(logSheet, message) {
  const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
  logSheet.appendRow([timestamp, message]);
}

function moveFileToFolder(fileID, folderID) {
  const file = DriveApp.getFileById(fileID);
  const folder = DriveApp.getFolderById(folderID);
  folder.addFile(file);
  DriveApp.getRootFolder().removeFile(file);
}

✔効果

  • コピペ廃止
  • 情報漏れゼロ
  • 共有スピード爆増

Google Geminiで予定&メール処理を時短

IGA
IGA

朝イチで全体がクリアになる!

▼何ができる?

  • 今日の予定を一瞬で把握
  • 空き時間ベースの日程調整
  • 今日届いたメールの要約
  • 返信文のたたき台まで自動生成

▼会話例(カレンダー編)

今日の予定を早い順にまとめて。
会議名と場所、対面かオンラインかも教えて。
明日はいつ30分空いてる?
日程調整メールの文面も作って。

▼会話例(メール編)

今日届いたメールのうち返信が必要なものを3件抽出して、
件名/送信者/要約/必要アクションを教えて。
それぞれの返信文案を丁寧なビジネス文で書いて。

✔効果

  • メール処理ストレス激減
  • 日程調整のミス防止
  • 朝の5分で「タスク見える化」

Fireflyでアイキャッチ・バナーを自動生成

IGA
IGA

画像のベース作りはAIにおまかせ!

▼使い方の型

  1. ChatGPTで構図と言語化
  2. Fireflyで生成
  3. Canva・Photoshop等で微調整
  4. ブログや資料に挿入

▼日本語プロンプト例

業務改善をイメージしたアイキャッチ。
PC、チェックリスト、青系、ビジネス向け、イラスト調。

✔効果

  • 統一感あるデザインに
  • アイキャッチ作成が数分で完了

🔚まとめ

IGA
IGA

AIは仕事を奪う存在じゃない。
一緒に働く“最強の相棒”です。

▼できるようになったこと

✔ 議事録30分以内
✔ Slack×GASで自動記録
✔ パワポ初稿10分
✔ アイキャッチ自動生成
✔ 予定&メール処理をGeminiで一括
✔ 「人がやる仕事」に集中できる

「まずは1つ、明日から試してみませんか?」

質問・コメントいつでもどうぞ。
役に立ったと思ったら ブックマーク&シェアお願いします!

■ 最後に—デザインの相談はお気軽に。

  • LP制作・Meta広告運用代行
  • ホームページ制作
  • バナー制作
  • 採用サイト構築
  • セミナー・スクールサイト構築
  • Elementor / STUDIO 実装
  • LINE公式xエルメ構築

など、あなたの事業に合わせて最適な提案ができます。

「まずは小さく試してみたい」という方も大歓迎です。

見積もりだけでも歓迎します!
ABOUT ME
猫乃手デザイン所|IGA
猫乃手デザイン所|IGA
中小企業・個人事業主のための「応募率アップ」専門 Webデザイナー
はじめまして、猫乃手デザイン所のIGAです。 採用・集客に強いホームページとランディングページ制作を中心に、 お客様の魅力がしっかり届くデザインをご提案しています。 「どこから始めたらいいか分からない…」という方も大歓迎です。 まずはお気軽にご相談ください。 あなたの挑戦に、デザインで力添えします。
記事URLをコピーしました