🔰中国駐在初心者社長の業務革新奮闘記Vol.2「会議連絡ツール」の作成

## 「仕事のための仕事」って結構多いよね:thinking:
私はグループ中国小売事業への商品供給をする物流機能会社の経営をしています。
コロナ真っ盛りの時期に社長として中国駐在となってもうすぐ2年、やるからには業務を「革新」しよう！と高い志と意気込みで乗り込んだものの、本来やるべき仕事をするための成果とはあまり関係がない仕事にたくさん時間をとられてませんか？

https://note.com/agscm_ono/n/n1fcfe369beda

https://qiita.com/AGSCMONO/items/e0465a91802fac6964a3

👆私と業務のご紹介、前回作成のツールです。よろしければお立ち寄りください！

### 自分の周りの業務内容をのぞいてみよう！

業務を革新していこう！という私の意気込みとはうらはらに、なかなか本来やりたい仕事に時間を投入できていないのが現実。ではいったいどんな仕事に時間を取られているんだろう？まずは私のアシスタントさんの業務にフォーカスしてみました。

会議と前後の業務のイメージ
![会議と関連する業務.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/a97d1eae-708a-7e59-e05b-83cbdcb03332.jpeg)

1時間の会議にいったいどれだけの無駄な時間がつかわれてるのだろう？？

今回取り組んだ、小さな業務改善は、「会議連絡連絡ツール」の作成です。
主要な会議は年度で計画をし、基本的には年度開始前に、グループ本社、親会社、グループ内関連企業と調整のうえ年間月度別スケジュールを作成します。続いてそのスケジュールと重複しないように社内会議スケジュールを作成します。それぞれの会議には参加者が決まっています。

・年間スケジュール：グループ本社、親会社、グループ内関連企業と調整の上、自社のスケジュールを加えて年間月度別スケジュールを作成。年度開始前に作成。
・月間スケジュール：年間スケジュールをもとに月間のイベントを作成。前月度20日ごろ作成。
・作成したスケジュールをエクセルで集計、メンバーにメール配信
・出欠席は確認できていない

会議実施には、会議資料の作成含め非常に多くの時間がかかります。さらには、会議の前工程としてスケジュール調整、参加者の出欠確認、案内。後工程として議事録の作成、送付など会議の内容と成果にはあまり関係がなさそうな「事務・調整業務」が多数発生していることがわかりました。アシスタントさんはを、エクセルやワード、Eメールを駆使してアナログ作業を行っており、本来期待している別のメイン業務に影響していることがわかりました。

そこで、今回は私の業務改善ツール作成第二弾は<dl> <dt>「会議連絡ツール」作成 </dt></dl>にすることにし、スケジュール案内や出欠確認をエクセルベースの属人管理からデータテーブル化し共有化することで省力化することにしました！


## 「会議連絡ツール」の完成品
会議の確認は年間スケジュールで決まっている次月の会議スケジュールを、前月20日に参加対象者個人にEmail連絡し、出席・欠席・未定をアプリ上で確認します。
アプリで入力した出欠席情報をもとに、共有されたGoogleカレンダーに会議ごとの参加者を自動反映させます。
各メンバーは共有カレンダーにアクセスすることで、どの会議にどのメンバーが参加するのか確認できます。



<dt>毎月20日、会議出席へアプリ配信、会議スケジュールと出欠確認</dt>

https://x.com/AgscmO63102/status/1820116415774597299

（左画像）全体の構造
（右上動画）次月度の会議スケジュールの案内と出欠確認の集計が自動でできました！
（右下動画）カレンダーで変更の反映を確認できました！

:::note info
便宜上仮のメンバー4名で設定しています。
:::

## 使用ツール

・Google Spread Sheets
・Google Apps Script
・Google AppSheet
・Google カレンダー
・[ChatGPT](https://openai.com/chatgpt/)

:::note info
Apps Sheetの利用はSpread Sheetsのデータテーブルを利用したアプリ作成と、最終的にAppScriptでGASを使ってカレンダーへの反映をするにあたり親和性を考慮して選択しました。
:::
## 会議連絡ツールの構造

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/5d630e4a-b207-5000-5a2b-67b8552adb9c.jpeg">
①～⑦は情報の流れを表しています。

## 作成工程
1. 会議連絡ツールの企画
2. データテーブルの作成
Google DriveのGoogle Spread Sheetsを利用してデータテーブルを作成します。
3. 会議連絡ツールの作成
データテーブル情報を基にGoogle AppsSheetを利用して、会議連絡アプリを作成
4. 各メンバーへの連絡
Google Apps Scriptのシェア機能を利用して各メンバーに会議連絡アプリのメール連絡
5. 各メンバーの会議スケジュール確認と出欠の入力
各メンバーそれぞれが送信されたメールから会議連絡アプリを開き、会議スケジュールを確認するとともに自身の出欠をアプリ上で登録
6. 出欠の集計
会議連絡上の出欠登録はAppsheetを経由しGoogle Spread Sheetsのデータテーブルに自動反映
7. Google カレンダーへの反映
データテーブルに反映した会議情報をGoogle Apps ScriptのGASを利用しGoogle カレンダーにバッチ自動反映（GAS作成はChatGPT利用）


### 1. 会議連絡ツールの企画の企画
<dt>「会議連絡ツールの企画」の作成</dt>

エクセル管理している年間スケジュールをデータベース化し、参加者情報と組み合わせて管理します。
アウトプットは共有するGoogle　カレンダーを使用することで、常に新しい会議スケジュールと参加者情報をメンバーと共有します。

### 2. データテーブルの作成
Google DriveのGoogle Spread Sheetsを利用してデータテーブルを作成します。
各種情報は人員増加時などのメンテナンスを考慮し、シートを分けて作成し、シート1に他のシートの情報を集約したデータベースとしました。

| シート | シートの内容 |
|:-:|:-|
| <dt>シート1<dt>  | 会議の実施日、参加者、開始時間、終了時間、イベント、出欠情報をまとめた他の3シートをまとめた表  |
|  イベント | イベント、実施日、	開始時間、終了時間情報  |
|  名簿 |  名前、メールアドレス情報 |
|   参加者| イベント、参加者情報  |

シート1に情報を集約
![データベース.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/9f81d032-202f-b5af-b29e-2e7a07e4e37a.jpeg)

### 3. 会議連絡ツールの作成
データテーブル情報を基にGoogle AppSheetを利用して、会議連絡アプリを作成します。
![AppSheet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/7dfc753f-6fb4-744d-c761-beeacb6c6cee.jpeg)
今回は出欠の確認のためユーザーからの修正は出欠のみとします。したがって、EDITは”出欠”の項目のみ☑を入れます。
### 4. 各メンバーへの連絡
AppsSheetのシェア機能を使って、各メンバーにメール送信します。
着信したメールよりAppSheetアプリにアクセスします。

:::note info
インフォメーション　
一度メール送付されたAPPは、以後更新された情報を見ることが出来ます。
（更新のたびにメール送信不要）
:::

### 5. 各メンバーの会議スケジュール確認と出欠の入力
アプリのカレンダーでメンバー各自が参加予定となっている会議を確認します。
デフォルトは出席となっていますが、欠席の場合は欠席ボタンをタップし、SAVEします。

![作成APP画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/fa3ac78e-acd1-e43d-cd2e-fce652d48a7f.jpeg)

### 6.  出欠の集計
会議連絡上の出欠登録はAppsheetを経由しGoogle Spread Sheetsのデータテーブルに自動反映します。
<dt>シート1のデータテーブル </dt>

![AppSheet反映確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/83f30b0b-c84b-556b-41b2-d703d927c8b9.jpeg)
App上で入力した会議の欠席が反映しています。

### 7. Google カレンダーへの反映

#### ・データテーブルからGoogle カレンダーへ会議情報反映させるGASを作成
AppScriptにChatGPTを利用して作成したGASを貼り付ける。

<details open><summary>ChatGPT指示用プロンプト </summary>

![プロンプト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/6f536d4f-daca-658f-24b5-f9201ab6f8ac.jpeg)
※実際にはApps Script実行エラー修正のためのプロンプト修正を数度実施
</details>

<details open><summary>AppScriptに記入したGAS </summary>

```
function createCalendarEvents() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var eventSheet = spreadsheet.getSheetByName('シート1');
  var attendeesSheet = spreadsheet.getSheetByName('参加者');
  var contactsSheet = spreadsheet.getSheetByName('名簿');
  
  if (!eventSheet || !attendeesSheet || !contactsSheet) {
    Logger.log('指定したシート名が存在しません: シート1、参加者 または 名簿');
    return;
  }

  Logger.log('シートが正常に取得されました: ' + eventSheet.getName() + ', ' + attendeesSheet.getName() + ', ' + contactsSheet.getName());
  
  var eventRange = eventSheet.getRange(2, 2, eventSheet.getLastRow() - 1, 5);
  var eventData = eventRange.getValues();

  Logger.log('フィルタリング前のイベントデータ: ' + JSON.stringify(eventData));
  
  var attendeesRange = attendeesSheet.getRange(2, 1, attendeesSheet.getLastRow() - 1, 2);
  var attendeesData = attendeesRange.getValues();
  
  var contactsRange = contactsSheet.getRange(2, 1, contactsSheet.getLastRow() - 1, 2);
  var contactsData = contactsRange.getValues();
  
  var attendeesMap = createAttendeesMap(attendeesData);
  var contactsMap = createContactsMap(contactsData);

  // 現在の月と次の月のイベントのみをフィルタリング
  var filteredEventData = eventData.filter(function(event) {
    var dateString = event[0];
    var date = parseDate(dateString);
    Logger.log('解析された日付: ' + date);
    return isEventInCurrentOrNextMonth(date);
  });

  Logger.log('フィルタリング後のイベントデータ: ' + JSON.stringify(filteredEventData));

  // バッチ処理用のデータをプロパティサービスに保存
  var scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.setProperty('eventData', JSON.stringify(filteredEventData));
  scriptProperties.setProperty('attendeesMap', JSON.stringify(attendeesMap));
  scriptProperties.setProperty('contactsMap', JSON.stringify(contactsMap));
  scriptProperties.setProperty('currentIndex', '0');

  // トリガーを設定してバッチ処理を開始
  ScriptApp.newTrigger('processBatch')
    .timeBased()
    .everyMinutes(10) // 10分間隔
    .create();
}

function processBatch() {
  var scriptProperties = PropertiesService.getScriptProperties();
  var eventData = JSON.parse(scriptProperties.getProperty('eventData'));
  var attendeesMap = JSON.parse(scriptProperties.getProperty('attendeesMap'));
  var contactsMap = JSON.parse(scriptProperties.getProperty('contactsMap'));
  var currentIndex = parseInt(scriptProperties.getProperty('currentIndex'));
  var batchSize = 1; // バッチサイズを1に設定

  var calendar = CalendarApp.getCalendarById('yukiono566@gmail.com');

  Logger.log('現在のインデックス: ' + currentIndex);
  Logger.log('イベントデータの長さ: ' + eventData.length);

  for (var i = currentIndex; i < currentIndex + batchSize && i < eventData.length; i++) {
    var dateString = eventData[i][0];
    var date = parseDate(dateString);
    if (isNaN(date.getTime())) {
      Logger.log('無効な日付: ' + dateString);
      continue;
    }
    
    var startTimeString = eventData[i][2];
    var endTimeString = eventData[i][3];

    Logger.log('開始時間文字列: ' + startTimeString);
    Logger.log('終了時間文字列: ' + endTimeString);

    var startTime = new Date(startTimeString);
    var endTime = new Date(endTimeString);
    
    Logger.log('開始日時: ' + startTime);
    Logger.log('終了日時: ' + endTime);
    
    var eventName = eventData[i][4];
    
    var attendeesNames = attendeesMap[eventName];
    if (!attendeesNames) {
      Logger.log('参加者情報が見つかりません: ' + eventName);
      continue;
    }
    
    var attendeesEmails = attendeesNames.map(function(name) { return contactsMap[name]; }).filter(function(email) { return email !== undefined; });
    if (attendeesEmails.length === 0) {
      Logger.log('名簿にメールアドレスが見つかりません: ' + eventName);
      continue;
    }
    
    Logger.log('イベント作成中: ' + eventName + ', 開始: ' + startTime + ', 終了: ' + endTime + ', 参加者: ' + attendeesEmails.join(','));
    
    var events = calendar.getEventsForDay(startTime);
    var duplicateEvent = events.find(function(event) {
      return event.getTitle() === eventName && event.getStartTime().getTime() === startTime.getTime() && event.getEndTime().getTime() === endTime.getTime();
    });
    
    if (duplicateEvent) {
      Logger.log('重複するイベントが見つかりました: ' + eventName + ', 日付: ' + startTime);
      continue;
    }
    
    calendar.createEvent(eventName, startTime, endTime, {
      description: '参加者: ' + attendeesNames.join(', '),
      guests: attendeesEmails.join(',')
    });
    
    // 各イベント作成後に遅延を追加
    Utilities.sleep(15000); // 15秒遅延
  }

  currentIndex += batchSize;
  if (currentIndex >= eventData.length) {
    // 全てのイベントが処理されたらトリガーを削除
    ScriptApp.getProjectTriggers().forEach(function(trigger) {
      if (trigger.getHandlerFunction() === 'processBatch') {
        ScriptApp.deleteTrigger(trigger);
      }
    });
    scriptProperties.deleteAllProperties(); // プロパティをクリア
    Logger.log('すべてのイベントが処理されました');
  } else {
    // 次のバッチのインデックスを保存
    scriptProperties.setProperty('currentIndex', currentIndex.toString());
    Logger.log('次のバッチのインデックス: ' + currentIndex);
  }
}

function createAttendeesMap(attendeesData) {
  var map = {};
  for (var j = 0; j < attendeesData.length; j++) {
    var eventName = attendeesData[j][0];
    var attendeeName = attendeesData[j][1];
    if (!map[eventName]) {
      map[eventName] = [];
    }
    map[eventName].push(attendeeName);
  }
  return map;
}

function createContactsMap(contactsData) {
  var map = {};
  for (var k = 0; k < contactsData.length; k++) {
    var contactName = contactsData[k][0];
    var contactEmail = contactsData[k][1];
    map[contactName] = contactEmail;
  }
  return map;
}

function createDateTime(date, timeString) {
  var dateTime = new Date(date);
  var timeParts = timeString.split(':');
  dateTime.setHours(parseInt(timeParts[0]), parseInt(timeParts[1]), parseInt(timeParts[2]));
  return dateTime;
}

function parseDate(dateString) {
  Logger.log('解析前の日付文字列: ' + dateString);
  var date = new Date(dateString);
  if (!isNaN(date.getTime())) {
    return date;
  }

  var parts = dateString.split('-');
  if (parts.length === 3) {
    return new Date(parts[0], parts[1] - 1, parts[2]);
  }

  var monthMap = {
    "1月": 0, "2月": 1, "3月": 2, "4月": 3, "5月": 4, "6月": 5,
    "7月": 6, "8月": 7, "9月": 8, "10月": 9, "11月": 10, "12月": 11
  };
  for (var month in monthMap) {
    if (dateString.indexOf(month) === 0) {
      var day = parseInt(dateString.replace(month, '').replace('日', '').trim());
      var year = new Date().getFullYear();
      return new Date(year, monthMap[month], day);
    }
  }

  return new Date(NaN);
}

function isEventInCurrentOrNextMonth(date) {
  var now = new Date();
  var currentMonth = now.getMonth();
  var currentYear = now.getFullYear();
  
  var eventMonth = date.getMonth();
  var eventYear = date.getFullYear();

  return (eventYear === currentYear && (eventMonth === currentMonth || eventMonth === currentMonth + 1)) ||
         (eventYear === currentYear + 1 && eventMonth === 0 && currentMonth === 11);
}
```
長大なGASになりましたが、主に日付の制御とカレンダーのAPIレート制限回避に行数を費やしています。
</details>

:::note warn
注意
・Googleカレンダーのデータ変更はAPIのレート制限というものがあるらしく、記入・削除が過度になされるとデータのやりとりが制限されます。
・そのためGASを使って一気にデータを流し込もうとしてもとGAS実行の途中で実行が停止してしまいます。
・実行停止を回避するために、データ量を絞る、バッチ処理するなどの工夫が必要です。
（今回はメインスクリプトとバッチスクリプトに分割。メインスクリプトを実行後、バッチスクリプトは10分間隔で実施に設定。バッチサイズを1とし、各イベント作成後に少し遅延を入れるといった措置をとりました）
:::

#### ・ トリガー機能の設定
Google Spread Sheetのデータテーブルの変更情報がGoogleカレンダーにバッチ反映させるためのトリガーを設定します。
下図矢印部分クリックしトリガーを開きます。
![トリガー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/50be4cb4-d7cd-d678-40d8-3f3579b7cf48.jpeg)
トリガーの編集を行います。
修正前データの削除：午前0時～1時
修正後のデータ反映：午前1時～2時　
GoogleカレンダーAPIのレート制限のため、メインスクリプトは午前1時より1回実施、サブスクリプトは10分後より10分ごとに終了まで自動的にバッチ処理をします。

:::note warn
注意
・　トリガーは様々な形で設定ができますが、時間設定はピッタリ○○時送信ということはできないようです（あくまで○○時から○○時の間に送信ということのようです）。
・　トリガーは「一時停止」のような機能がありません。設定した時刻になるたびにトリガー機能が発動するので、止めるためにはトリガー自体を削除する必要があるようです。
:::

<dt>Googleカレンダーに反映 </dt>

![グーグルカレンダー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/6ada2f75-6c61-480c-dabb-cb69dc894a7b.jpeg)

Googleカレンダーに意図通りスケジュールと、参加者変更が反映しました。
以後はメンバーに共有されたこのカレンダーをベースに会議スケジュール管理をして行くことができます。:v:

## メンバーからのフィードバック:grin:
今回は、職場の身近で起きている困りごとを解決するをテーマに「会議連絡ツール」アプリを作成しました。
そこで、実際に職場で働く2名の方に感想をヒアリングすることにしました！

<dt>ヒアリングをお願いした2名</dt>

* Ｔさん：日本人。総務系業務のベテラン。秘書室での勤務経験あり（アナログ会議スケジュールの元作成者）

<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/45954fe1-c969-f4cd-d11b-83ce77497621.jpeg">

* Ｌさん：中国人。アシスタント。複数日系企業での社長秘書経験あり（以前の会社でWeChatの企業Bot作成経験あり）

<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/fcd1657b-08c3-215d-06c2-854e2912c405.jpeg">


<dt>私の状況説明</dt>
まずは簡単に私の今の状況とヒアリングの目的を説明しました！

・ プロトタイプ作成の勉強をしている
・ それを用いて職場の身近な困りごとについて解決しようと試みている
・ 今回のプロトタイプ作成の背景・動機を本稿の前半の内容を使って説明。
（VPN接続が出来ないと中国ではApp Sheet、Google カレンダーにアクセスできないため、Tさんのみ操作、Lさんは会議用大スクリーン！にて動作を確認してもらいました）

<dt>ヒアリング内容</dt>
今回のプロトタイプについて以下の内容をヒアリングしました！

* 利便性はあるだろうか？役に立ちそうか？
* 足したらもっと利便性のあがる機能があるとしたら何か？
* その他なんでも感想を


Tさん：（意見に対する私の回答は→にて）
* 便利そう
* メール文面は送信先によってカスタマイズ化出来ないか？
会議参加者によってはメールで会議のアナウンス一つするにも文面の細心の注意が必要なので、参加者ごとにカスタマイズ化できないか？
→今回の構想は多数のメンバーに会議スケジュールを一括送付し、それぞれの回答を一括受動集計するという利便性を追求した。そのため、”カスタマイズ化”のニーズに即したアプリを作成するとなると、今回の構造ではなく以下のように作成することが出来ると思う。
１，メールの本文をヘッダー・ボディ・フッターに分ける。
２，ボディは会議案内の本文（記　の下の部分）にあたり、内容は各人固定。ヘッダー、フッターを送付する人によって変える。ヘッダーの時候の挨拶は案内送付する時期を考慮した文書をChatGPTで作成。
３，氏名、役職名などは予めテーブルを作成
４，上記をGASなどを使って組み合わせてメール下書き完成。
５，最後に人の手で”粗相”がないか確認の上、発信
* 会議の参加可能時間の調整もある。例えば10：00-14：00の会議で10：00-12：00は参加可能だけれども、12：00以降は中座という場合はの調整はできないか？
→今回出欠項目で、参加・不参加・未定の三項目の選択しか変更権限を与えなかったが、参加時間の変更もApp SheetのEDITで選択すれば対応可能だと思う。

Lさん：
* 中国ではGoogleは使えないので、代替ツールを探す必要がある
→現在捜索中！一緒に探してください
* アプリの作成が難しそうです
→およそ2時間ぐらいの講義を受けて作っています。そこまで難しくはありません。また誰かが作成すれば全員使えるようになります。全員がこの作成技術を持つ必要はありません。
* アナログ会議スケジュール表からデータテーブルを作成するのが大変そうなので、当社の毎月のスケジュール作成をエクセルベースから直接MSアウトルックに変えたらどうでしょうか？
→MS アウトルックは会社のセキュリティがしっかり入っているので外部情報との連携がしずらいように思う（実際トライしましたが、失敗しました）。企業WeChatのスケジュール表に反映させたらメンバー全員で共有できるのでMS アウトルックより利便性が高いのでは？

<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/c6eea940-6bf4-ee26-c44d-357ef0cd7801.jpeg">

企業WeChatのカレンダー画面　社内の各種情報プラットフォームになっているので、最初からこちらに反映できればベストです！いいアイデアが出てきました！！

<dt>ヒアリングのまとめ</dt>
説明含めた1時間ほどのヒアリングでしたが、使い勝手についての感触はつかみにくかったです。
むしろ、プロトタイプの勉強始めるよ！と宣言して約1か月でそれなりのモノを見せられて若干驚きを隠せない、というような感触でした（私が逆の立場ならきっとそうでしょう:smile:）。
ですがしばらくすると、それぞれの過去と現在の経験から、会議に対してはいろいろと思うところがあるらしく、活発な討論が出来ました。

<dt>結論：</dt>

１，中国で利用するためのGoogleの各種ツールに代替するツールを確保する
２，企業WechatカレンダーのAPIをどうやって確保するか確認する
３，アナログ会議スケジュール表と決別する（管理をカレンダーツールで行うことを前提に会議スケジュールを作成する）

まずは1，2を実施した上で、3の達成のため実行に移りたいと考えていますが、今回の大きな収穫は3,の「アナログ会議スケジュール表と決別する」だと思います。次の取り組みにもつながる良い方向性です！

## 苦労した点:tired_face:
・「時間」の処理
ChatGPTを使ってGASの作成をしましたが、Spread Sheetから会議の日付、開始時間、終了時間の”時間”を取得し、カレンダーに反映するための処理に手間取りました。
Spread Sheet上の記述形式をChatGPTにしっかりインプットしてあげると、正しい回答をしてくれました。

![時間取得エラー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/cd43780b-55d7-b021-da88-91014192e63f.jpeg)
「時間」の処理に毎回苦労しています

・Googleカレンダーのデータ変更はAPIのレート制限
GASの試行錯誤でカレンダー上に書き込み、削除を繰り返しているうちにデータ制限を超えたらしく、エラーが表示されてしまうようになりました。詳しい情報は検索しても不明ですが、なるべく少ない情報で試行錯誤し、うまくいってから大量のデータを流し込むなど工夫が必要です。

![流量エラー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/e5980571-7f52-7f03-d79c-4335f839858a.jpeg)
今回の一番の苦労はここでした:sweat:

## 会議連絡ツールの企画の改善・改良点:slight_smile:
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/8175a122-76c1-a904-ba39-b5ab85e9bde4.jpeg">

<dt>・そもそもエクセルベースの会議スケジュール作成を毅然として止めるという選択を！</dt>
今回このテーマで会議スケジュールの作業について様々な角度で考えました。現在の実態はただ紙がエクセルに置き換わったたけのかなりのアナログ作業です。PCの前に座って業務をしているので外見はそれなりに事務作業をしてる感は出ますが、実際は鉛筆と消しゴムで作業しているのと何も変わりません。
アナログ作業はアナログ作業を連鎖して生むので、思い切って次年度からはやめてしまう選択もありですね。

・ならば、会議実施の企業間での調整が必要！
アナログ会議スケジュールをやめるとすると、自社だけでなく関連各社も併せて実施しないと効果薄いですよね。
デジタル会議スケジュールとして各社間で使用するにするには、機能が全然足りません。このあたりは企画をもう少し練って進めたいところです！

## 第２弾「会議連絡ツール作成」を終えて:laughing:
業務改革に向けての小さな業務改善の2回目は会議と前後の業務の省力化をを目的としたツールを作成してみました。ヒアリングした2名も同じ感覚を持っていたようで、良い本質的な改善案も出てきたのは大きな収穫です！！
（中国で実用化するためにはまだ中国で使えるツールへの移植作業が残りましたが、心強い味方も見つかりました）

今回のヒアリングは、ツールの評価を期待してのヒアリングでしたが、むしろいつの間にかこんなことをやっていたのか？というショックを与えてしまったようです。ですが、すぐに「こんなのはできないか、あんなのはできるのか」と前向きな期待感に変わっていくのを感じました。ツールへの評価うんぬんより、この反応がとてもありがたいです。なんとか引き続きやっていけそうな感触です！


こんな機能があったらいいね、使えるねというアイデアがありましたら是非教えてください！
最後までお付き合いいただき、ありがとうございました！！

![agile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812519/61515a35-ac47-17da-8ae3-b5d889554ce6.png)
<dt>拙速不如巧迟！　スピードが命！！