Google Apps Script（GAS）で議事録を瞬時にタスク管理表へ！ChatGPTが教えてくれた秘訣

こんにちは！新規事業に取り組む藤吉郎です。毎週の定例会議で議事録を作成しており、その業務を効率化する方法を模索中です。
今回は、議事録から自動でタスク管理表を作成する方法を紹介します。

![animal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/63aff9ff-156d-32b7-3d5f-3f57441246de.png)

## 普段の議事録作成業務をご紹介！

### ①会議議事録の作成

基本的にアナログ人間なので（機械を少し疑っているww）、議事録文字起こしシステムは使わず、耳と手を駆使してブラインドタッチ！
会議メンバーで発言もしながら、ひたすらWordに書き起こしていきます。その後、見直しや手直しをし、箇条書きなど段落を整えて完成させます。

### ②タスク管理表に転記

作り上げたWordの議事録を読み起こし、Googleスプレッドシートの「タスク管理表」に「タスク」「担当」「期限」を転記していきます。
議事録を書きながらこの作業はできないので、後から読んで～、書いて～、読んで～、書いて～の繰り返しです。

![コメント 2024-08-24 020026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/e4d6c35e-ad18-de26-e81e-4f07033bae6a.png)

これって自動的にできないかな？

**議事録から自動的にタスク管理表を作成したい！**

## 自動化するための方法を探る

### ChatGPTにやり方を聞いてみた 

(^^♪『議事録の情報をタスクにまとめるプログラムを作りたい』

![screencapture-chatgpt-c-fe54ae85-467c-48a5-b72f-d9e016e93203-2024-08-23-22_17_30 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/14ff20d7-9207-fce4-49fb-3b6dd2ae9a83.png)

ふむふむ。色んな方法があるんですね。
ChatGPTはPythonを使った例を紹介してくれましたが、今回は今も使用しているGoogleスプレッドシートを使いたい！
そこで、Google Apps Script (GAS) を使う方法が良さそうだと思いました。

### 具体的なプロンプトを出してみた！

(^^♪『Word形式の議事録からタスクをスプレッドシートにまとめる方法をGASを使って実施したい』

![GPt1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/dd2c412b-78bd-7271-4b73-efbe4c75e84b.png)

![GPT2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/116ee0fe-bc8f-50ba-78e2-fd92ab1260de.png)

「タスク」というキーワードでコマンドを書いてくれました！
これだけでは足りないので、「担当」と「期限」も入れて修正しました。
修正後のコマンドは[こちら](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/9b4ce9b9-1578-52ac-9c72-c10989057de2.png)


## 議事録作成

### Googleドキュメント形式で作成

議事録はWordではなく、Googleドキュメント形式で作成していきます。
でもきっと作り方や書き方には何らかのルールがあるはず！

ChatGPTの回答はこちら！
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/c1bb2515-f9cc-bf91-abeb-6806537fc043.png)

呼び出したい情報は1行ずつ書くそうです。

### 作った議事録はこちら

「タスク」「担当」「期限」を1行ずつに記載。日付は数値で入力。
Googleドキュメント形式でGoogle Driveに保存します。

![コメント 2024-08-23 231054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/a4d5f044-f9aa-d872-c87c-71ddb6db0401.png)

## Googleスプレッドシートを作成

結果を返すGoogleスプレッドシートを作成します。
タイトルは「議事録タスク」と名付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/07f832cc-8c07-6ad5-a928-d6da460151f0.png)

A1セルに「タスク」B2セルに「担当」C2セルに「期限」と入力

## GASでコマンド作成

ChatGPTが教えてくれた「タスク」「担当」「期限」を入れたプロンプト

![gpt4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/9b4ce9b9-1578-52ac-9c72-c10989057de2.png)

### ID設定方法
![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/ba6b992b-99a2-ab3a-976e-31cf97fc3a17.png)

GoogleドキュメントとGoogleスプレッドシートのIDは、それぞれのURLに書かれています。

**GoogleドキュメントのID**

![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/e69e1578-e4cf-df14-d61e-8679b5ab7c1f.png)

**GoogleスプレッドシートのID**
![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/622a0242-a534-d8da-5c4d-f7e66ff13802.png)

コードをApps Scriptにコピーし、必要項目を記載して実行！
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/6ed96d7d-2ad9-782c-a120-ff4898e33cea.png)

## エラー対応

### エラーが発生した

![gpt5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/12282644-919b-4a78-d7ac-fc0d726b0fe9.png)

実行したら英語のエラーコードが出ました！（読めない）
検索するとこの記事が！！


https://qiita.com/apple123/items/df4696df98ee6d97e68b

### エラーの原因を調査した

記事の中にこんな内容が！
![コメント 2024-08-24 002932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/ea318419-ed3c-55d2-b1a2-a131741b63c8.png)

慌ててGoogle Driveを確認したら同じ問題が発生していました！

![コメント 2024-08-24 001541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/efc10bdb-5479-7a8b-ed12-810d3b17204f.png)

Googleドキュメント形式で保存し、再挑戦！

## 結果

実行成功～

![コメント 2024-08-24 001107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/5c4e8cfa-0109-8ada-88f3-5ced1cae7af9.png)

### スプレッドシート確認

議事録に書いていたタスク、担当、期限が反映されています！

![コメント 2024-08-24 001128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/496d4d12-f485-a3d9-8aeb-87ea5d31601d.png)

これからは議事録を作る時点から形を決めておけば、あっという間に反映だ！
ただその都度「タスク」「担当」「期限」を改行して書くのって大変かも。今までの書き方のままできたらいいなぁ。

## 【応用編】今までの議事録形式で検証
ここからは<font color="Red">さらに効率化を目指す方法</font>
タスク管理表に反映させるには、議事録作成時に「タスク」「担当者」「期限」を１行ずつ分けて書かないといけないですが、今までの書き方でもできる方法はないのかな、過去の議事録を使って検証します。

## ChatGPTに作成方法を聞く

(^^♪『過去作成した議事録から「タスク」「担当者」「期限」に分けた内容に再作成してください」

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/0badec33-9dc4-59aa-49ed-c0a6dac5dafe.png)

具体的な議事録があれば再作成してくれるとのこと！
過去の議事録をコピペして、ChatGPTに貼り付けました。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/22432b2a-6e17-db8c-12b1-7291ebd98b18.png)
※実際の議事録のため、内容は隠しております。

**その結果**

何ということでしょう！！
書かれた議事録から「タスク」「担当」「期限」が表になって出てきた！
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/94444b45-fd2f-7b62-082f-f7d66d22550c.png)

す、すごいぞ。すごすぎる！！
元々の議事録に期限が書いていなかったので、そこは「未記載」としてまとめくれている。

### Google Apps Scriptで使える形式に変更

タスク管理表への自動化にはGoogleドキュメントに「タスク」「担当」「期限」を１行ずつ書かないといけないためこの表のままでは使用できません。そこもChatGPTに助けてもらいました。

(^^♪『タスク、担当者、期限をGoogleドキュメント形式で記載してください』

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/cb153c63-54d6-8f14-474d-a7d8c133bde0.png)

ちゃんと改行して書いてくれました。

## Google Apps Scriptで使ってみる

### Googleドキュメント形式で保存する

Googleドキュメントにコピペし、未記載だった期限も入力してGoogleDrive内に保存。
![naohi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/8cdea3e3-ecaa-e677-4883-92e372ae3afc.png)


### Apps Scriptの実行

Googleスプレッドシート「議事録タスク」を立ち上げ、Apps Scriptに先ほど作成したGoogleドキュメントのIDを入力。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/e0fa26e5-61ce-3df6-f47b-2b24aa292821.png)

無事実行出来ました。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/8a36078b-1dd9-7add-f6d3-8958a8b02342.png)

### Googleスプレッドシート確認

ちゃんと入力されていました！

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/07b16b1a-2311-de43-9858-1c4dd8ceacd2.png)

あらかじめ「タスク」「担当」「期限」を１行ずつ書いていなくても、議事録作成後に要点をChatGPTにまとめてもらえば、**今までの書き方でもできる！**
とはいえ今後はChatGPTがわかりやすいように、議事録の取り方も工夫していきます。


## 【進化版】ChatGPT APIを使用した方法（2024.9.1追記）

### ChatGPT APIを活用すればもっと短縮できる

前回作成したものは議事録の内容を、ChatGPTのプロンプト欄にコピペして、要約してもらい、Googleドキュメントにする方法でした。
しかしChatGPT APIを使えば、直接GASから書き込めるよ！と恩師からのご提案をいただきました。
なんか難しそうだけどチャレンジしてみましょう。
**※ChatGPT APIは有料版しか使用できませんのでご注意を**

### GASのコマンドを確認
(^^♪『ChatGPT　APIを使用して、GoogleドキュメントのタスクをGoogleスプレッドシートにまとめることができるGASのコマンドを教えてください。モデルはChatGPT 4oです。「タスク」「担当」「期限」に分けて書いてください。』

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/b10c5fc7-f652-a5f5-f6cf-dc73c5672341.png)

Googleドキュメントの議事録を、GoogleスプレッドシートにまとめてくれるGASのコードを作成してくれました。

## 用意するもの
* ChatGPT 4o
* Googleドキュメント（議事録）
* Googleスプレッドシート（結果を返す）

## GASの作成

### Apps Sprictへコマンド入力
ChatGPTが教えてくれたコマンドをコピペし、必要情報を入力してきます。

<details>
  <summary>コマンド全文（長いので折りたたみ）</summary>

  function extractTasksFromGoogleDoc() {
  const apiKey = 'YOUR_API_KEY'; // OpenAIのAPIキーをここに入力
  const documentId = 'YOUR_DOCUMENT_ID'; // タスクを抽出したいGoogleドキュメントのIDをここに入力
  const sheetId = 'YOUR_SHEET_ID'; // タスクをまとめたいGoogleスプレッドシートのIDをここに入力
  
  // Googleドキュメントの内容を取得
  const doc = DocumentApp.openById(documentId);
  const text = doc.getBody().getText();
  
  // ChatGPT APIを使ってタスクを抽出
  const tasks = extractTasksWithChatGPT(text, apiKey);
  
  // Googleスプレッドシートにタスクを出力
  const sheet = SpreadsheetApp.openById(sheetId).getActiveSheet();
  sheet.clear(); // シートの内容をクリア
  
  // スプレッドシートにヘッダーを設定
  sheet.appendRow(['タスク', '担当', '期限']);
  
  // タスクをスプレッドシートに書き込む
  tasks.forEach(function(task) {
    sheet.appendRow([task.task, task.assignee, task.deadline]);
  });
}

function extractTasksWithChatGPT(text, apiKey) {
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  
  const headers = {
    'Authorization': 'Bearer ' + apiKey,
    'Content-Type': 'application/json'
  };
  
  const prompt = `以下のテキストから「タスク」「担当」「期限」を抽出して、次の形式でリストを作成してください: タスク: [タスクの内容], 担当: [担当者名], 期限: [期限]\n\n"${text}"`;

  const payload = {
    'model': 'gpt-4', // 使用するモデル名
    'messages': [{'role': 'user', 'content': prompt}],
    'max_tokens': 300, // 必要に応じてトークン数を調整
    'temperature': 0.7 // 応答のクリエイティビティを制御するパラメータ
  };

  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload)
  };
  
  try {
    const response = UrlFetchApp.fetch(apiUrl, options);
    const json = JSON.parse(response.getContentText());
    const tasksText = json['choices'][0]['message']['content'].trim();
    
    // タスクを分割してオブジェクトに変換
    const tasks = tasksText.split('\n').map(function(taskLine) {
      const taskParts = taskLine.split(', ');
      return {
        task: taskParts[0].replace('タスク: ', '').trim(),
        assignee: taskParts[1].replace('担当: ', '').trim(),
        deadline: taskParts[2].replace('期限: ', '').trim()
      };
    });
    
    return tasks;
  } catch (e) {
    Logger.log(e);
    return [{task: 'タスクの抽出に失敗しました。', assignee: '', deadline: ''}];
  }
}

</details>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/e2d73136-afb1-98bb-dd0c-7d9a0b8b4764.png)

ここで必要な情報は3つ！
* OpenAI(ChatGPT）のAPIキー
* GoogleドキュメントのID
* GoogleスプレッドシートのID

それぞれコピペします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/101d88e1-257a-6064-fcb3-5a828469ff09.png)

## 実行してみます

### 成功！でもなんか違う
指定したスプレッドシートに結果が返されました。
さらにすごいことに、議事録のタスク部分だけを切り出されています。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/827817ba-8259-a4d6-9b39-e2616128e5f5.png)

しかし期限のところに担当者が入っていたり、いくらChatGPTだって元の議事録が整備されていなければ読み取れませんよね。
これは人間の私の議事録の書き方が悪いせい。

### ChatGPTが判別しやすい議事録の取り方は？

ChatGPTが判別しやすい議事録の書き方にするのが必要です。
書き方は本人に聞いてみましょう！

(^^♪『ChatGPTが判別しやすい議事録の書き方を教えてください。』

回答はこちら

![screencapture-chatgpt-c-660682bb-40c1-4b90-b6da-7bb3add9ba35-2024-09-01-08_40_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844917/5a305e33-1024-8fdf-4a0c-e475129b3008.png)

次回の議事録はこの形式で書いてみて実行してみます。

## まとめ
当たり前のように、目で見て転記していた作業が、ChatGPTがまとめて、ボタン一つの実行でできるなんて目から鱗！
とはいえ、いくら賢いAIだって、人間の取る議事録が整備されていなければうまく活用できないことも感じました。
人間とAIとの融合！議事録ってなんて奥が深いのでしょうか！
トライ＆エラーを繰り返し、議事録職人を目指していきます。