4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Apps ScriptAdvent Calendar 2021

Day 21

GASで推しのYouTubeチャンネルの更新をDiscordに通知する

Posted at

####この記事はGoogle Apps Script Advent Calendar 2021の21日目の記事です

GASで作った理由

YouTube APIがお手軽に扱えるから
Trigger機能がとても便利

システム詳細

Discordへの通知

webhookを利用

YouTubeの情報の取得

YouTube Data APIとYouTubeのRSSを利用
YouTubeのRSSは以下のURLで取得できる

https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID

情報の集積

Google Spread Sheetを利用
チャンネルごとのシートに分けて管理

ソースコード

中身の紹介

取得したいチャンネルの管理

辞書形式でChannel IDとチャンネル名で格納しています.
チャンネル名はAPIで動画ごとに取得するとQuota1が無駄になるし,シート管理でも利用しているのでこんな感じです.

main.gs[5-9]
const channels ={
  'CHANNEL_ID_1': 'CHANNEL_NAME_1',
  'CHANNEL_ID_2': 'CHANNEL_NAME_2',
  'CHANNEL_ID_3': 'CHANNEL_NAME_3',
}

シート名をエスケープする理由

チャンネル名(= シート名)に'が入ってるとスプシのQUERY関数がお亡くなりになってしまう...

複数のシートから検索する方法

先ほども登場したQUERY関数を利用しています.
なんといっても爆速なのが良いところ

複数のシートから検索する際はまずこんな感じに

main.gs[97-99]
Object.values(channels).map((val)=>{
    return 'QUERY(\''+escape_html(val)+'\'!A:G, "select * offset 1", 0)'
  }).join(';')

Object.values(channels)はチャンネル名の配列で,それぞれのシートの見出し以外の部分をすべて取得するクエリQUERY('SHEET_NAME'!A:G, "select * offset 1", 0);で接続した文字列を作ります.

これで全件取得したのであとは範囲を選択するところに{}で囲った上記の値を入れると検索できます.

main.gs[101]
main_sheet.getRange(2,1).setValue('=QUERY({'+query_sheet+'}, "where Col1 is not null order by Col3 desc", 0)')

注意事項
全件そのまま取得したい場合はwhere Col1 is not nullのようにselect *以外の何らかの条件を指定しないとうまく取得できなかったりする.
合成した仮想シートの行はA, B, C, D...ではなくCol1, Col2, Col3, Col4...となります.

他にコード見て質問あったらコメントでして下さいませ.

ついでに私の推し癒月ちょこ先生をよろしくお願いします.

  1. YouTube APIを利用するたびにかかるコスト https://developers.google.com/youtube/v3/getting-started?hl=ja#quota

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?