🧑‍💻

Instagramの投稿のためのリサーチをGASで自動化する※YouTube編

2024/05/01に公開

実現できること

  • Instagramの投稿の「ネタ」のリサーチを自動化する
  • Instagram以外のコンテンツからデータを取得したい
  • 誰でも使えるようにスプレッドシート上にシステムを構築
  • キーワードを検索してリサーチしたい

実装方法

  • YouTube Data API v3を使用して、タイトルと再生数を指定数取得
  • スプレッドシート上で操作ができるようにスクリプトを割り当て

今回の方法では、自分が欲しいキーワードを入力すれば、YouTubeのタイトルと再生数を瞬時に取得できます。Instagramに投稿するコンテンツのため各自の参考になるワードを入れていきます。複数ワードも可能です。
またAPIを通して取得できるデータはそのほかにもあり、自分の好きなようにカスタマイズ可能です。

YouTube Data API v3を利用する

  • GASのサービスを選択

  • YouTube Data API v3を選択して追加

データを取得する手順

シートを準備して、次は検索用のセルを指定します。
ここでは"C2"にしています。キーワード検索するために必ず必要です。
各自のシート名を"任意のシート名"こちらに入力してください

const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const settingsSheet = spreadsheet.getSheetByName("任意のシート名");
 // 設定を格納するシートとして使用するシートを指定
const keyword = settingsSheet.getRange("C2").getValue();
// C2セルから検索キーワードを取得

YouTube動画のデータを取得

YouTube.Search.list() メソッドを使用して、指定されたキーワードでYouTubeの動画を検索しデータの取得をします。

 // データを取得
  const results = YouTube.Search.list('snippet', {
    q: keyword,
    maxResults: 50
  }).items;
  • maxResults: 50 ここで検索数を指定しています。今回は50件
// 動画の詳細情報と統計情報を取得
  const videoIds = searchResults.map(item => item.id.videoId).join(',');
  const videosResponse = YouTube.Videos.list('snippet,statistics', {
    id: videoIds
  });
const videoDetails = videosResponse.items || [];
//取得したデータがnull もしくは undefined の場合、videoDetails には空の配列が代入
  • YouTube.Videos.list('snippet,statistics', {id: videoIds});
    取得したい項目を増やす場合はカンマ区切りでsnippet,statisticsに足していく

データの書き込み

let mySheet = spreadsheet.getSheetByName("任意のシート名");
const lastRow = mySheet.getLastRow();
for (let i = 0; i < searchResults.length; i++) {
  mySheet.getRange(lastRow + i + 2, 1).setValue(searchResults[i].snippet.title);
  mySheet.getRange(lastRow + i + 2, 2).setValue(videoDetails[i] ? videoDetails[i].statistics.viewCount : 0);
}
  • 取得した動画の情報をスプレッドシートに書き込みます。各動画のタイトルは1列目に、再生数は2列目に書き込まれます。再生数が取得できない場合は、0が書き込みされるようにしています。
  • 複数回検索することも考慮して、書き込みの際は1行空けて記載するようにしています。

スプレッドシートの設定

ここからは、作成したコードをスプレッドシート上で操作できるように図形にスクリプトを割り当てて、操作性を高めていきます。誰でも使用できるようにするためには必須の設定。

  • まずは図形作成のため挿入→図形描画を選択

  • 続いて図形を選択して描画、テキストも入れます。

  • 図形を選択し、横の縦3つの点をクリックしてスクリプト割り当てを選択

作成したスクリプト名を入力またはコピーします。

  • 選択はできないので、GASのページからコピーしてください

説明は以上です。

コード全文

function searchKeyword() {
  // スプレッドシートを開く
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const settingsSheet = spreadsheet.getSheetByName("任意のシート名"); // 設定を格納するシートとして使用するシートを指定
  const keyword = settingsSheet.getRange("C2").getValue(); // C2セルから検索キーワードを取得

  // データを取得
  const searchResults = YouTube.Search.list('snippet', {
    q: keyword,
    maxResults: 50
  }).items;

  // 動画の詳細情報と統計情報を取得
  const videoIds = searchResults.map(item => item.id.videoId).join(',');
  const videosResponse = YouTube.Videos.list('snippet,statistics', {
    id: videoIds
  });

  const videoDetails = videosResponse.items || [];

  // "任意のシート名"という名前のシートを取得
  let mySheet = spreadsheet.getSheetByName("任意のシート名");

  // 既存データの最終行を取得
  const lastRow = mySheet.getLastRow();

  // スプレッドシートにデータを追記(既存データがある場合は1行空けてから最終行に追記)
  for (let i = 0; i < searchResults.length; i++) {
    mySheet.getRange(lastRow + i + 2, 1).setValue(searchResults[i].snippet.title);
    mySheet.getRange(lastRow + i + 2, 2).setValue(videoDetails[i] ? videoDetails[i].statistics.viewCount : 0);
  }
}

使い勝手を良くする

取得したデータを消すためのリセットボタンがあると便利なので実装してみました。
リサーチは何度も検索するのであると非常に使い勝手が向上します。

function clearSheetData() {
  // スプレッドシートを開く
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  // "任意のシート名"シートを取得
  const mySheet = spreadsheet.getSheetByName("任意のシート名");
  // シート内のデータの最終行を取得
  const lastRow = mySheet.getLastRow();
  // データが存在する場合はクリア
  if (lastRow > 2) { // 3行目以降にデータがある場合のみクリア
    // A列からB列までの範囲をクリア
    mySheet.getRange("A3:B" + lastRow).clearContent();
  }
}
  • 3行目からデータのクリアを指定(項目名を消さないため)
  • 最終行の習得はデータがクリアになったかの確認

その他の設定は同じです。図形を描画して割り当ててください。
そのためにスクリプトは別にしておきましょう。

まとめ

以上で、Instagramの投稿のためのリサーチをGASで自動化する作業は終了です。
今回はYouTude上のコンテンツから情報を収集しましたが、Instagram以外からネタを集めることが差別化には重要だと思います。
サムネイルの画像なども収集可能なので、デザインの参考にも使えます。
実装にあたっては、ChatGPTに質問して解決できるレベルだと思いますが、何か質問があればお気軽にお問い合わせください!

Discussion