####この記事は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が無駄になるし,シート管理でも利用しているのでこんな感じです.
const channels ={
'CHANNEL_ID_1': 'CHANNEL_NAME_1',
'CHANNEL_ID_2': 'CHANNEL_NAME_2',
'CHANNEL_ID_3': 'CHANNEL_NAME_3',
}
シート名をエスケープする理由
チャンネル名(= シート名)に'
が入ってるとスプシのQUERY関数がお亡くなりになってしまう...
複数のシートから検索する方法
先ほども登場したQUERY関数を利用しています.
なんといっても爆速なのが良いところ
複数のシートから検索する際はまずこんな感じに
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_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...
となります.
他にコード見て質問あったらコメントでして下さいませ.
ついでに私の推し癒月ちょこ先生をよろしくお願いします.
-
YouTube APIを利用するたびにかかるコスト https://developers.google.com/youtube/v3/getting-started?hl=ja#quota ↩