GoogleMeetの出席レポート機能を使って、定例会議の出欠状況を集計してみた

:::note
この記事は[🎄LITALICO Engineers Advent Calendar 2024🎄](https://qiita.com/advent-calendar/2024/litalico) シリーズ4の23日目の記事です。
:::

# はじめに

[LITALICO](http://litalico.co.jp/)の @negi です。

約1年前にJinjineer（ジンジニア）になりました。
2C向けのプロダクト開発をメインに扱うエンジニア組織のHRBP（人材開発、組織開発）的な役割を担っています。

GoogleMeetの出席レポートに関するtipsがあまり多くなく、集計の際に困ったことと、その対応について書いてみました。

# きっかけ
部内で実施されている定例会議（任意参加）の出欠状況をモニタリングしたいというのがきっかけです。

任意参加と言えども、毎回会議に参加できない人がいたとすると、組織内で情報の非対称性が生まれてしまうので、
何か欠席の事情があるのか、別会議と時間が被っていないか、など、HRやマネージャーから能動的にアクションを起こせる状態にしたいと思いました。

# やったこと

### はじめは、GoogleMeetの参加者一覧を目視確認で対応
在宅でオンラインで働く方、出社してオフラインで働く方、状況が人それぞれなので、働く場所を意識せず会議ができるよう、基本はGoogleMeetを使っています。

初手としては、GoogleMeetの参加者一覧を目視確認して、スプレッドシートに出欠状況を入力していました。

![Meet_-_デイリースタンドアップ_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/2cd7489c-b2e9-bdb0-1791-c2f9822c537d.png)

ここで困ったのが下記です。

* **自分が参加できないときに出欠記録が取れない**
    * 目視作業は、誰かに依頼するのも気が引ける面倒くささ…
* **会議に遅れて参加したり途中で抜けたりと、人の出入りがある**
    * 「この人さっき居たはずなのに、今見たらいない…」
* **毎回出席してるけど実は参加時間が短い人、を把握できない**
    * 「別の会議と被っていて、いつも前半しか参加できない」

### GoogleMeetの出席レポート機能活用

もっとモニタリングコストを下げられないか探していたところ、GoogleMeetの出席レポート機能に辿り着きました。

[Google Meet ヘルプ「出欠状況の確認とライブ配信に関するレポートの表示」](https://support.google.com/meet/answer/10090454?hl=ja)
※ GoogleWorkspaceの特定のプランの契約が必要です

#### 出席レポートの機能をオンにする手順は2つ

##### 1. GoogleMeetのオプション設定で「主催者」もしくは「共同主催者」になる

* カレンダーの予定を開く
* GoogleMeetの⚙️マークから「ビデオ通話オプション」の設定へ
    * ![株式会社LITALICO_-_カレンダー_-_予定の詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/562ae1ed-e070-704f-2771-bc93b2f44175.png)
* 「ゲスト」タブから、共同主催者を追加
    * ![株式会社LITALICO_-_カレンダー_-_予定の詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/647f8c80-e474-ccc1-4aee-4dffacd0c834.png)

##### 2. 「主催者用ボタン」タブから、「出欠状況の確認」をオンにする

*  ![株式会社LITALICO_-_カレンダー_-_予定の詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/296a9493-bb53-aa14-e7a0-3cdbf7e8a6c3.png)

出席レポートで出力される項目は下記です。

```
名
姓
メールアドレス
参加した日時
退出した日時
所要時間
```

![PE部事例共有会__高崎の会__-_2024_12_04_12_58_JST_-_出席_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/f8aa8537-9d58-791a-0a3c-8c19de84f069.png)

#### 新たな課題
この情報があれば、人の出入りのタイミングや、参加時間までわかるから、万事解決！と思ったのも束の間、次の課題が出てきました。

* 「所要時間」の表記形式が扱いづらい
    * 1時間未満だと「分」形式ですが、1時間超えると「X時間Y分」形式になる
    * スプレッドシートの「経過時間」形式（`H:mm:ss`）だったらいいのに
* 出席レポートから集計用のスプレッドシートに毎回データをコピペするのが面倒
    * 人 × 開催日ごとにいい感じに集計したい

### 集計シート作成

先に完成形をお見せするとこちら。

集計シート
![事例共有会_出欠表_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/3e29ecb0-ba98-2c12-ae88-7bf016972c70.png)

人単位で、平均参加時間と累積参加回数を算出。
算出元のデータはI列より右側に、日付ごとの参加時間を人単位で列挙してあります。

作成過程は下記の通り。

#### 1. **出席レポートに「参加時間」列を追加**
「X時間Y分」形式だと非常に扱いづらいので、仕方なく手動で列追加です。
出席レポートの表の最右列に下記の関数で時間を算出します。

`VALUE(F2-E2)*24*60`

![PE部事例共有会__高崎の会__-_2024_12_04_12_58_JST_-_出席_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/d472db87-b341-dd1a-6501-ac5641285031.png)


#### 2. **集計用シートでデータ参照する準備**

あとは集計先のスプレッドシートで `importrange` すれば終わりですが、
会議の度に新しい出席レポート（スプシ）が生成されるので、出席レポートのURLを転記する場所を作っておきます。（GASを使えばここも自動化できそうですが、今回は見送り）


出席レポートのURL格納用シート
![事例共有会_出欠表_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/6403044b-044b-b2ec-092d-52420c7f4e15.png)

A列を開催日の日付、B列に日付に対応する出席レポートのURLを転記。

ポイントはC列で、 `importrange` で別スプレッドシートを参照するために、アクセス権限の許可を実行する必要があります。
許可の操作を自動化することはできないようなので、URLを転記すると同時に、アクセス権限を許可するポップアップが出るように関数を仕込みます。

`MAP(B2:B,LAMBDA(v,if(v="",,IMPORTRANGE(v,"'参加者'!$G$1"))))`

![事例共有会_出欠表_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/04edb9a7-9de6-4ee2-db19-c4876b3472e8.png)

* Googleから出力される出席レポートのデフォルトのシート名は「参加者」
* 適当なセルを `importrange` できればOK
* `map` 関数で繰り返し実行できるので、C1セルに関数を書くだけでOK
    * `map` 関数は `arrayformula` に似ていますが、`importrange` には適用できません

これで、URLを転記するだけでアクセス権確認が出るようになりました。手動で許可ボタンを押します。
![事例共有会_出欠表_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/6d046b5c-aa7c-2f22-ce2c-920990773096.png)



#### 3. **集計シートでデータを参照する**

完成形はこちら

`arrayformula(iferror(vlookup($C2:$C,IMPORTRANGE(VLOOKUP(I$1,'出欠シートURL一覧'!$A$2:$B,2,false),"'参加者'!$C$2:$G"),5,false),0))`

![事例共有会_出欠表_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62612/aa521336-d983-b058-1ef3-9d1a6b97478f.png)

* `VLOOKUP(I$1,'出欠シートURL一覧'!$A$2:$B,2,false)`
    * 2で列挙した出席レポートのURLを格納しているシートから、該当日付（`I1`セル）の出席レポートのURLを探す
* `IMPORTRANGE(上記式,"'参加者'!$C$2:$G")`
    * 取得した出席レポートのデータを取り込み
    * 取り込みたいのは、`メールアドレス` と 手動で追加した `参加時間` 列
* `iferror(vlookup($C2:$C,上記式,5,false),0)`
    * 社員を特定できるキーがメールアドレスしかないので、事前に社員のメールアドレスは列挙しておく（`C` 列）
    * `C` 列のメールアドレスをキーにして、該当する `参加時間` （今回は `G` 列を取得
    * 欠席者がいると参照先のデータがない（出席レポートに出てこない）ので、iferrorでエラーハンドリング（今回はゼロ分を返すようにした）
* 列で数式を繰り返したいので `arrayformula` を使う
    * 前項の `vlookup` の第一引数が `$C2:$C` になっているのは `arrayformula` を使うため

# おわりに
会議のモニタリングは継続的に行うものなので、初期コストをかけても運用コストを下げたかったのですが、会議終了後の作業は、ほぼURL転記のみになったので目的は果たせました。

また、`vlookup` 関数の引数に `importrange` をとることで、抽出したデータを一度シートに出力することなく参照できるので、ブラウザのメモリ消費も抑えられる [^1] ようです。


[^1]:https://note.com/mir4545/n/nb42644e72ea9#29596002-3a4d-42b0-8ae1-88de54eef55e