【GASで業務効率化】YouTube配信実績を自動更新するスクリプトを作ってみた

## 誰のための記事？
タスクマネージャーなど、毎日いろんな集計に悩み、YouTubeAPIを使って、
集計を自動化したい方を向けに書いています。

## なんで解決したいの？
会社が運用するYouTubeチャンネルがあり、SEO対策のため、更新頻度を増やすことにしました。当然、動画編集担当が集計する余裕がなくなり、データがだんだん怪しくなってきたのがきっかけです。

<B>「こんなちまちまな作業を自動化すれば全て解決じゃない？!! 」</B>
という発想に至りました。

## 何を実現したかった？
小さい会社に勤めていて、仕事は山ほどあります。
「忙しい」だけで終わらせず、チームメンバーの自己研鑽のための時間、人生の時間を1秒でも多くENJOYできるように、自動化できることを自動化して、可処分時間を増やして、みんなよりHAPPYな人生を過ごせる体制を作りたい!!!!

## 実際やったこと
<b>GASを使って、YouTubeの配信実績（BEST 50）を毎日定時に自動更新!!</b>

と言っても、<b>特定のチャンネル</b>のベスト50を取得しますので、ジャンルごとにデータを取得したい方は、コードをいじってください。

そして、Google Scripts Appsの基本操作はこちらの記事を参考してください。

https://qiita.com/nobu09/items/a098e2c2345fd17c4b71

### 1. YouTube APIを取得
YouTubeのAPIキーはGoogle Cloud Platformのコンソールから取得できます!
下記の記事をご参考ください。

https://qiita.com/shinkai_/items/10a400c25de270cb02e4

### 2. GASを書く

a. まず、毎日動画のデータを取得する
```
function getDailyVideoStats() { 
  
  var apiKey = 'YouTubeAPI　KEY';

  var channelId = 'YouTubeチャンネルID';
  
  // チャンネルの動画を取得
  var videoIds = getChannelVideos(channelId, apiKey);
  
  // それぞれの動画の統計情報を取得し、スプレッドシートに追加
  for (var i = 0; i < videoIds.length; i++) {
    var videoId = videoIds[i];
    var videoStats = getVideoStats(videoId, apiKey);
    writeStatsToSheet(videoStats);
  }
}
```

b. 動画のidを取得する

```
function getChannelVideos(channelId, apiKey) {
  var url = 'https://www.googleapis.com/youtube/v3/search?part=id&channelId=' + channelId + '&maxResults=50&order=date&type=video&key=' + apiKey;
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  var videoIds = [];

  for (var i = 0; i < json.items.length; i++) {
    var videoId = json.items[i].id.videoId;
    videoIds.push(videoId);
  }

  return videoIds;
}
```

c. 特定の動画の再生数を取得する
```
function getVideoStats(videoId, apiKey) {
  var url = 'https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&id=' + videoId + '&key=' + apiKey;
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());
  var video = json.items[0];
  var snippet = video.snippet;
  var statistics = video.statistics;

  return {
    title: snippet.title,
    videoId: videoId,
    viewCount: statistics.viewCount,
    date: new Date()
  };
}
```

ちなみに、グッド、バッド、コメントもカウントできます!! その時は```return```の部分に追加してください。

```
likeCount: statistics.likeCount,
dislikeCount: statistics.dislikeCount,
commentCount: statistics.commentCount,
```

d. ここが```非常に重要```!! 自動的に記入してもらうように、あるものを数字だけ追加し、ないものを自動的にスプレットシートに追加してもらいます。
```
function writeStatsToSheet(videoStats) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var found = false;
  var dateColumn;

  // 既に存在する日付の列を探す
  for (var i = 1; i <= lastColumn; i++) {
    var currentDate = sheet.getRange(1, i).getValue();
    if (currentDate instanceof Date && currentDate.toDateString() === videoStats.date.toDateString()) {
      found = true;
      dateColumn = i;
      break;
    }
  }

  // 日付が存在しない場合、新しい列に日付を追加 
  if (!found) {
    dateColumn = lastColumn + 1;
    sheet.getRange(1, dateColumn).setValue(videoStats.date);
  }

  // タイトルが既にシートに存在するかどうかを確認し、対応する行に統計情報を書き込む
  for (var i = 2; i <= lastRow; i++) {
    var currentTitle = sheet.getRange(i, 2).getValue();
    if (currentTitle === videoStats.title) {
      sheet.getRange(i, dateColumn).setValue(videoStats.viewCount);
      return;
    }
  }

  // タイトルが見つからなかった場合、新しい行に動画情報を追加
  var data = [
    videoStats.videoId,
    videoStats.title,
  ];
  data[dateColumn - 1] = videoStats.viewCount;
  sheet.appendRow(data);
}
```

### 3. トリガーを設定する

トリガー（＝時計マーク）をクリックして、「トリガーを追加」をクリック。
![スクリーンショット 2023-05-09 10.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959760/b1894a85-97bc-fbf6-96c6-0603b0f88064.png)

1. getDailyVideoStatsを実行関数に設定
2. 時間主導型にし、日付ベースタイマーを設置
3. 毎日更新時刻を決める

![スクリーンショット 2023-05-09 10.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959760/09a86de2-f512-2f60-d1e8-431182776974.png)

完成!!!

毎日、定時に更新してくれます!! そこから関数を使っていろんな統計ができますので、ぜひ試してみてください。

再生数は累計になりますので、毎日の再生回数は関数で計算すればOK!!

![スクリーンショット 2023-05-09 10.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959760/a6ccb68b-d0ce-486f-b008-c6109d1ff720.png)


## あとがき
バリバリコード書くタイプではないので、周りに比べたら引き目を感じてる時が多いですが、目の前にいる同僚が雑務から解放され、やりたい仕事へ集中できる姿を目の当たりにする時、業務改善は単なるタスクを減らすだけではないと気づきました。

雑務って、結構いい人そうで、人当たりのいい新人に行きがちで、それを減らせることによって、負担を減り、「いい人」をただのいい人に終わらせないための手助けでもあると考えると、タスクを減る以上の価値があると思っております。

なので、これからも業務改善を継続するつもりです!!
コメントもお待ちしております。