見出し画像

データを取得する配信者のリスト作成

こちらの記事で記載したように配信者の切り抜きを半自動で作成するプログラムを作成します。

複数の配信者の配信を追うことは現実的に(多分)不可能なので配信された配信のデータベースを作成します。(次回予定)

今回はその為に配信のDBに追加するチャンネルのリストを作成します。
リストに追加されたチャンネルは過去から遡り全ての配信をデータベースに追加します。
一人の切り抜きしか行わない場合は今回の作業は不要になります。

私は様々な人の切り抜きを機械やAIを用いて行おうと思っているので複数のVtuberさんの切り抜きをしたいです。

利用ツール

利用するツールは以下のツールです。

  • GAS(GoogleAppsScript)

  • GoogleForm

  • スプレッドシート

利用方法

Formの作成

特定のGoogleDriveのフォルダにてFormを作成します。
やり方が分からない方はネット検索してください。

今回設定するのは画像の
①設定
②質問事項
③スクリプトエディタ
になります。

設定について

①の設定に関しては上記のようにメールアドレスの収集の設定をオフにします。

質問事項について

質問事項については以下の内容を回答するようにします。
質問のタイトル部分はどうでもいいです。
後々プログラムで配列として扱うので順番さえ一致していればプログラムがコピペで利用できます。

1.Vtuberのチャンネルリンク
こちらは元動画のアーカイブがあるVtuberさんのチャンネルリンクを記載するためです。
2.アップロードするチャンネル
自分で投稿する切り抜きチャンネルのURLを記載してください。

これらをスプレッドシートに記載するプログラムを記載するのですが、
「普通に最初からスプレッドシートに記載すればよくね?」
と思われると思います。

わざわざプログラムを通す理由は主に以下の二つがあります

  1. チャンネル名など正式な名称が後々必要になるから

  2. チャンネルURLなどに間違いが無いか最初にプログラムを通すことで確認するため

プログラムコード

この画像で3番の「スクリプトエディタ」を選択すると
プログラムが記載できるようになると思います。
以下のプログラムをコピペして変更点・追加は各々変更してください

/**
 * 一番最初に動く関数
 */
function add_channel_info_main(e) {
  let const_values = new Master_Values()
  /**
   * GoogleFormから送られてくる情報が全てeに格納されている
   * eから回答された内容を配列youtuber_info_for_videoに格納する
   */
  let form_ansers_info = new Form_ans_class(e)

  /**
   * 記載されたYoutubeチャンネルリンクがスプレッドシートに記載されているか確認する
   * 記載されていたらそれ以降のプログラムは動かない。
   */
  if (check_spreadsheet(form_ansers_info.vtuber_channel_url, const_values)) {
    return 0;
  }
  /**
   * YoutuberのチャンネルIDを関数get_youtube_channel_idに送ることで取得する。
   * 
   * 取得したチャンネルIDを関数get_youtuber_nameに送りYoutuberのチャンネル名の正式名称を取得する。
   */
  let channel_id = get_youtube_channel_id(form_ansers_info.vtuber_channel_url);
  let youtuber_name = get_youtuber_name(channel_id, const_values.youtube_base_url, const_values.youtube_api_key);
  form_ansers_info.vtuber_name = youtuber_name

  /**
   * Youtuberのチャンネル名称でGoogleDriveにフォルダを作成する。
   * 作成されたフォルダURLが返される。
   */
  let made_video_folder_url = drive_make_and_get_url(form_ansers_info.vtuber_name, const_values.drive_id);
  form_ansers_info.forlder_url = made_video_folder_url

  /**
   * 関数write_new_info_to_spreadsheetで今まで得た情報をスプレッドシートに記載する。
   */
  write_new_info_to_spreadsheet(form_ansers_info, const_values.sheet_id, const_values.sheet_name);
}

/**
 * データベースになっているスプレッドシートに記載されている内容を収録する。
 * 取得した内容からチャンネルリンクが記載されている列を順番に確認し、指定されたチャンネルリンクが記載されていたらTrueを返す。
 * 最終行までリンクが見つからない場合はFalseを返す
 */
function check_spreadsheet(youtuber_channel_url, const_values) {
  let sheet = SpreadsheetApp.openById(const_values.sheet_id).getSheetByName(const_values.sheet_name);

  let last_row = sheet.getLastRow();
  let last_column = sheet.getLastColumn();

  let range = sheet.getRange(1, 1, last_row, last_column).getValues();
  if (range.length <= 1) {
    return false
  }
  for (let i = 1; i < range.length; i++) {
    if (range[i][1] == youtuber_channel_url) {
      return true;
    }
  }
  return false
}

/**
 * 送られてきたYoutuberの名前で新しいフォルダを作成する。
 * Youtuberの名前でフォルダを検索し、そのフォルダーのURLを取得、返す。
 */
function drive_make_and_get_url(name, drive_id) {
  let master_folder = DriveApp.getFolderById(drive_id);
  master_folder.createFolder(name);
  let made_folder = DriveApp.getFoldersByName(name);
  let drive = made_folder.next();
  let folder_url = drive.getUrl();
  return folder_url;
}

/**
 * シートIDとシート名から記載するシートを取得する。
 * そのシートの最後の行を指定する。
 * 指定した内容を記載して終了
 */
function write_new_info_to_spreadsheet(info, sheet_id, sheet_name) {
  let sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);

  let last_row = sheet.getLastRow();

  let store_value = [[info.vtuber_name, info.vtuber_channel_url, info.clip_channel_url, info.forlder_url]];
  sheet.getRange(last_row + 1, 1, 1, store_value[0].length).setValues(store_value);
}row + 1, 1, 1, store_value[0].length).setValues(store_value);
}
/**
 * YoutubeチャンネルのURLが送られてくる。
 * しっかりとは原理を理解してないがURLをHTML関連で検索して、特定の文字列の部分で分割するとチャンネルIDの部分を取得できる、
 * 的なプログラム
 */
function get_youtube_channel_id(url) {
  const html = UrlFetchApp.fetch(url).getContentText();
  const text = Parser.data(html).from('title="RSS" href="').to('">').build();
  const channel_id = text.split('=')[1];
  return channel_id;
}

/**
 * YoutubeチャンネルのチャンネルIDが送られる
 * YoutubeAPIを利用してチャンネルの情報を取得するが、今回返すのはチャンネルのタイトルのみ
 */
function get_youtuber_name(channel_id, base_url, api_key) {
  let data_url = base_url + "channels?part=snippet&id=" + channel_id + '&key=' + api_key;
  let responce = UrlFetchApp.fetch(data_url);
  let json_data = JSON.parse(responce);
  return json_data.items[0].snippet.title;
}
class Master_Values {
  constructor() {
    this.sheet_id = PropertiesService.getScriptProperties().getProperty(`SS_sheet_id`)
    this.sheet_name = PropertiesService.getScriptProperties().getProperty(`main_sheet_name`)
    this.youtube_base_url = "https://www.googleapis.com/youtube/v3/";
    this.youtube_api_key = PropertiesService.getScriptProperties().getProperty(`youtube_api_key`)
    this.drive_id = PropertiesService.getScriptProperties().getProperty(`master_drive_id`)
  }
}

class Form_ans_class {
  constructor(e) {
    let form_ansers_info = e.response.getItemResponses();
    this.vtuber_channel_url = form_ansers_info[0].getResponse()
    this.clip_channel_url = form_ansers_info[1].getResponse()
  }
}

プログラム利用のための追加点

Parserライブラリの追加
GASのライブラリの「+」ボタンから以下のIDを入力してParserライブラリを検索して追加します

1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

プログラムの変更点

最後に記載されている部分のClass部分はGASにおけるスクリプトプロパティを利用しています。
スクリプトプロパティに下記の内容を記載して下さい。

  • SS_sheet_id(情報を記載するスプレッドシートのシートID)

  • main_sheet_name(配信者リストを記載するシート名)

  • master_drive_id(このあとフォルダに色々作るのでその為の親フォルダID)

  • youtube_api_key(自分でYoutubAPIKeyを取得して下さい)

最後にやること

GASのプロジェクトのトリガー設定を行います。

この設定で保存すれば作業は終了です。
実際に動くことをフォームに回答することで確認しましょう。


次回の更新をご期待くださいませ

この記事が気に入ったらサポートをしてみませんか?