如何下載 YouTube 頻道裡的留言?不用申請金鑰,YouTube 留言擷取工具,複製貼上一鍵抓留言

如何下載 YouTube 影片留言
如何下載 YouTube 影片留言 (ai 生成照片)

有在經營 YouTube 頻道的朋友,相信一定有想過把影片上的留言下載下來,不管是進行分析,用做備份,或是把影片所有的留言彙整,改寫成 FAQ 的文章格式,一次性的把所有常見問題做個懶人包。

可真的要動手下載留言的時候,才發現:欸~!YouTube Studio 裡,居然沒有可以一鍵下載留言的地方?....不會吧~!

會!的確在 YouTube Studio 裡,真的沒有這種功能,不管是網頁版,還是 App 版都沒有。

但不是經常聽說某某某做了某個頻道或是某支影片的留言分析,又公布了各種分析結果嗎?那他們又是怎麼做到的呢?難道要訂閱數達到某個門檻才會開放留言下載功能?還是留言數要突破多少則,才會顯示這個下載功能呢?

其實不管你是幾百萬訂閱的頻道,還是有幾萬則留言,這部分倒是很公平,YouTube 一視同仁的都沒有提供這個留言下載的功能,如果想要下載留言,最快的方式,也是被 Google 認為最標準的方式,就是使用他們家的 Google API 服務

所以接下來,我們就來跟大家分享一個 YouTube 留言擷取工具如何使用 Google API 來擷取 YouTube 影片的留言,並自動匯入 Google Sheet,方便後續任何型態的利用。

同時更方便的是,這次提供的方法,不需要去申請 Google 金鑰,直接貼上特定的程式碼,就可以立即開抓 YouTube 影片留言。

YouTube 留言擷取工具 | 從安裝到擷取留言全攻略

準備好了?跟著下面簡單的幾個步驟,很快就可以完成你專屬的 YouTube 留言擷取工具囉!

步驟一:準備 Google Sheets 試算表文件

新增試算表,開啟 Apps Script
新增試算表,開啟 Apps Script

在第一個步驟中,我們先開啟 Google Drive(雲端硬碟),新增一個 Google 試算表(或是直接進入 Google Sheets,新增一個 Sheet 文件)。 要留意,這個試算表一旦新增,並綁定這個擷取留言的程式碼,就不能刪除,不然又要重頭來喔,因為這個程式碼是綁定在這個試算表裡的,試算表與程式碼是同生共死,缺一不可的喔。

  1. 建立一份你想用來存留言的 Google Sheets 試算表文件
  2. 在試算表上方的功能表,點選「擴充功能」>「Apps Script」> 開啟 Apps Script 編輯器

步驟二:新增專案編輯器的 API 服務

在專案編輯器裡,新增服務
在專案編輯器裡,新增服務

接下來的第二步,我們需要在專案編輯器中,新增兩個特定的服務YouTube Data API v3Google Sheets API,做法如下:

  1. 在 Apps Script 編輯器左邊 > 點「服務」>「+」(新增服務)
  2. 在新增服務的清單中,找出 YouTube Data API v3 (通常在清單的末端倒數第二個),然後點『新增』。
  3. YouTube Data API v3 新增完成後,再次找出另一個 Google Sheets API,然後點『新增』。

在這個步驟中大家要特別留意的是,點擊『新增服務』後,開啟的對話方塊裡,除了上方的服務清單,下方還有一個ID*的欄位,這個欄位可以完全忽略,不需要修改(由於後續的程式碼是使用預設的識別碼,所以也不能修改,除非你要一併修改程式碼),當你選定了某個 API 服務,這個欄位會自動更新成該服務的識別碼,例如選了 YouTube Data API v3,就會自動顯示為 YouTube

新增完成了兩個服務之後,在側邊欄下方,會出現兩個項目:YouTubeSheets,這樣就完成新增 API 服務的設定,接下來就準備貼上程式碼了!

步驟三:貼上程式碼

這個留言擷取工具,需要複製貼上兩段代碼,一個是 Code.gs(Apps Script 的程式碼)另一個是 HTML 原始碼

複製並貼上 Code.gs

我們把目光轉移到 Apps Script 編輯器,這個編輯器預設就有一個空的程式碼,像下面這樣子:

function myFunction() {
  
}

我們全選,把這些預設的代碼清空,然後複製下面的程式碼(點擊右上角的『複製按鈕』),貼在編輯區裡面:

/**
 *
 * 這個 Apps Script 是綁定到特定 Google Sheet 的單獨執行版本。
 * 它的功能有:
 * 1. 在 Google Sheet 中建立一個自訂選單「YouTube 留言工具」。
 * 2. 點擊「YouTube 留言工具」選單 >「擷取影片留言」後,會彈出一個合併的對話方塊,
 * 3. 要求輸入 YouTube 影片 ID、您的頻道名稱(選填)以及工作表名稱(選填)。
 * 4. 如果未提供頻道名稱(@MyChannelName),程式將只獲取頂層留言 (不含回覆的留言)。
 * 5. 影片標題將自動擷取並預填到「工作表名稱」欄位中,你可以手動編輯。
 * 6. 根據「工作表名稱」欄位創建一個新的工作表,或清空同名現有工作表。
 * 7. 擷取指定 YouTube 影片的所有留言和回覆(如果提供頻道名稱)或僅頂層留言。
 * 8. 標示出您自己的留言和回覆(如果提供頻道名稱)。
 * 9. 將所有留言數據匯出到指定的工作表中。
 *
 * 設定步驟:
 * 1. 開啟打算長期使用的 Google Sheet (不要刪除,因為程式綁定在這個 Sheet 上)。
 * 2. 點擊「擴充功能 (Extensions)」>「Apps Script」。
 * 3. 清空編輯器中現有的所有代碼,並貼上以下所有代碼。
 * 4. 在 Apps Script 編輯器左側的「服務 (Services)」旁邊,點擊「+」號。
 * 5. 搜尋並選擇「YouTube Data API v3」,點擊「新增」。
 * 6. 搜尋並選擇「Google Sheets API」,點擊「新增」。
 * 7. 保存專案 (Cmd + S 或 Ctrl + S)。
 * 8. 首次執行或保存後,會要求授權。完成授權流程。
 * 9. 重新載入您的 Google Sheet (Cmd+R 或 F5)。
 * 10. 在 Google Sheet 頂部的選單下,就會看到「YouTube 留言工具」。
 */

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('YouTube 留言工具') // 自定義選單的名稱,可以任意修改,不影響功能
      .addItem('擷取影片留言', 'triggerGetYouTubeComments') // 選單項目名稱和對應的函數
      .addToUi();
}


function triggerGetYouTubeComments() {
  const ui = SpreadsheetApp.getUi();

  try {
    const htmlOutput = HtmlService.createHtmlOutputFromFile('InputForm')
        .setWidth(400)
        .setHeight(410); // 調整對話框高度以容納HTML表單

    ui.showModalDialog(htmlOutput, '輸入影片資訊');

  } catch (dialogError) {
    ui.alert('對話框載入錯誤', '無法載入輸入對話框,請檢查 Apps Script 檔案名稱或設置。詳情:' + dialogError.message, ui.ButtonSet.OK);
    Logger.log('載入對話框時發生錯誤:' + dialogError.message);
    Logger.log(dialogError.stack);
  }
}

function getVideoTitleById(videoId) {
  if (!videoId) {
    return '';
  }
  try {
    const videoResponse = YouTube.Videos.list('snippet', { id: videoId });
    if (videoResponse.items && videoResponse.items.length > 0) {
      const title = videoResponse.items[0].snippet.title;
      return title;
    } else {
      return '';
    }
  } catch (e) {
    Logger.log('獲取影片標題時發生錯誤:' + e.message);
    return '';
  }
}

function processFormDataFromHtml(data) {
  const ui = SpreadsheetApp.getUi();
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  const VIDEO_ID = data.videoId ? data.videoId.trim() : '';
  const YOUR_CHANNEL_DISPLAY_NAME = data.channelName ? data.channelName.trim() : '';
  let SHEET_NAME = data.sheetName ? data.sheetName.trim() : '';

  if (!VIDEO_ID) {
    ui.alert('操作已取消', '沒有輸入影片 ID,程式已終止。', ui.ButtonSet.OK);
    Logger.log('沒有輸入影片 ID,程式終止。');
    return;
  }

  // 清理工作表名稱
  SHEET_NAME = SHEET_NAME.replace(/[\/\\?*\[\]:]/g, '_').substring(0, 80).trim();
  if (!SHEET_NAME) {
    SHEET_NAME = 'YouTube Comments';
  }

  let sheet = spreadsheet.getSheetByName(SHEET_NAME);

  if (sheet) {
    sheet.clear();
  } else {
    sheet = spreadsheet.insertSheet(SHEET_NAME);
  }

  // 設定標頭
  sheet.appendRow(['Comment ID', 'Parent ID', 'Author', 'Content', 'Published At']);

  const allCommentsAndReplies = [];
  let commentThreadsPageToken = null;
  let totalCommentsProcessed = 0;
  const includeReplies = YOUR_CHANNEL_DISPLAY_NAME !== '';

  try {
    do {
      const commentThreadsResponse = YouTube.CommentThreads.list('snippet,replies', {
        videoId: VIDEO_ID,
        textFormat: 'plainText',
        maxResults: 100,
        pageToken: commentThreadsPageToken
      });

      if (!commentThreadsResponse.items || commentThreadsResponse.items.length === 0) {
        Logger.log('該影片沒有找到留言,或留言功能已被禁用。');
        break;
      }

      commentThreadsResponse.items.forEach(function(thread) {
        const topLevelComment = thread.snippet.topLevelComment.snippet;
        const threadId = thread.id;

        // 頂層留言
        allCommentsAndReplies.push([
          threadId,
          '', // Parent ID 空
          topLevelComment.authorDisplayName,
          topLevelComment.textDisplay,
          new Date(topLevelComment.publishedAt).toLocaleString()
        ]);
        totalCommentsProcessed++;

        // 回覆
        const totalReplyCount = thread.snippet.totalReplyCount;
        if (includeReplies && totalReplyCount > 0) {
          Logger.log(`  - 正在獲取頂層留言 (ID: ${threadId}) 的 ${totalReplyCount} 個回覆...`);
          let repliesPageToken = null;
          do {
            const repliesResponse = YouTube.Comments.list('snippet', {
              parentId: threadId,
              textFormat: 'plainText',
              maxResults: 100,
              pageToken: repliesPageToken
            });

            if (repliesResponse.items) {
              repliesResponse.items.forEach(function(reply) {
                const replySnippet = reply.snippet;

                allCommentsAndReplies.push([
                  reply.id,
                  replySnippet.parentId,
                  replySnippet.authorDisplayName,
                  replySnippet.textDisplay,
                  new Date(replySnippet.publishedAt).toLocaleString()
                ]);
                totalCommentsProcessed++;
              });
            }
            repliesPageToken = repliesResponse.nextPageToken;
          } while (repliesPageToken);
        }
      });

      commentThreadsPageToken = commentThreadsResponse.nextPageToken;
    } while (commentThreadsPageToken);

    // 將留言寫入 Sheet
    if (allCommentsAndReplies.length > 0) {
      sheet.getRange(sheet.getLastRow() + 1, 1, allCommentsAndReplies.length, allCommentsAndReplies[0].length)
        .setValues(allCommentsAndReplies);

      // 自動隱藏不必要欄位
      try {
        sheet.hideColumn(sheet.getRange('A1')); // 隱藏 Comment ID 欄位
        sheet.hideColumn(sheet.getRange('B1')); // 隱藏 Parent ID 欄位
      } catch (e) {
        Logger.log('自動隱藏欄位時發生錯誤: ' + e.message);
      }

      // 自動設定欄寬
      sheet.setColumnWidth(3, 150); // Author
      sheet.setColumnWidth(4, 600); // Content
      sheet.setColumnWidth(5, 160); // Published At

      ui.alert(`成功獲取 ${totalCommentsProcessed} 條留言並匯出到 Google Sheet "${SHEET_NAME}"!`, `影片 ID: ${VIDEO_ID}\n頻道名稱: ${YOUR_CHANNEL_DISPLAY_NAME || '未提供,僅獲取頂層留言'}`, ui.ButtonSet.OK);
      Logger.log(`成功獲取 ${totalCommentsProcessed} 條留言及回覆。`);
    } else {
      ui.alert('該影片沒有找到任何留言或回覆。', `影片 ID: ${VIDEO_ID}\n頻道名稱: ${YOUR_CHANNEL_DISPLAY_NAME || '未提供,僅獲取頂層留言'}`, ui.ButtonSet.OK);
      Logger.log('該影片沒有找到任何留言或回覆。');
    }

  } catch (e) {
    ui.alert('執行過程中發生錯誤:' + e.message, `影片 ID: ${VIDEO_ID}\n頻道名稱: ${YOUR_CHANNEL_DISPLAY_NAME || '未提供,僅獲取頂層留言'}`, ui.ButtonSet.OK);
    Logger.log('錯誤:' + e.message);
    Logger.log(e.stack);
  }
}

複製貼上後,程式碼的部分就完成了,很簡單吧?

新增一個 HTML 檔案:InputForm.html

建立一個新的 HTML 檔案
建立一個新的 HTML 檔案

貼上程式碼(這個程式碼預設的名稱為:Code.gs)之後,緊接著進行下面的步驟:

  1. 在側邊欄中,第一個項目『檔案』,點『』 > 然後選「HTML
  2. 命名為 InputForm(不用寫.html,Apps Script 編輯器會自動寫入副檔名)
  3. 接著貼入以下內容:
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
        font-family: Arial, sans-serif;
        background-color: #f1f3f4;
        display: flex;
        justify-content: center;
        align-items: center;
        overflow: hidden;
      }
      .container {
        padding: 20px 24px 16px 24px;
        border-radius: 0px;
        background-color: #ffffff;
        box-shadow: 0 4px 16px rgba(0,0,0,0.2);
        width: 100%;
        max-width: 420px;
        max-height: 100%;
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        position: relative;
      }
      label {
        display: block;
        margin-bottom: 5px;
        font-weight: 500;
        color: #3c4043;
      }
      input[type="text"] {
        width: 100%;
        padding: 10px 12px;
        margin-bottom: 12px;
        border: 1px solid #dadce0;
        border-radius: 4px;
        box-sizing: border-box;
        font-size: 14px;
      }
      .note {
        font-size: 12px;
        color: #5f6368;
        margin-bottom: 12px;
        line-height: 1.4;
      }
      .buttons {
        display: flex;
        justify-content: flex-end;
        gap: 8px;
        margin-top: 16px;
      }
      button {
        background-color: #1a73e8;
        color: white;
        padding: 8px 16px;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        font-size: 14px;
      }
      button:hover {
        background-color: #174ea6;
      }
      button#cancelButton {
        background-color: #f1f3f4;
        color: #3c4043;
      }
      button#cancelButton:hover {
        background-color: #e8eaed;
      }
      .loading-overlay,
      .videoTitle-overlay {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(255, 255, 255, 0.7);
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 16px;
        color: #1a73e8;
        font-weight: bold;
        z-index: 999;
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        transition: opacity 0.3s ease, visibility 0.3s ease;
      }
      .loading-overlay.active,
      .videoTitle-overlay.active {
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <form id="inputForm" onsubmit="submitForm(event)">
        <label for="videoId">YouTube 影片 ID:</label>
        <input type="text" id="videoId" name="videoId" placeholder="例如:dQs4w_WgXAQ" required onblur="fetchVideoTitle()">
        <div class="note">請輸入您想查詢留言的 YouTube 影片 ID。</div>

        <label for="channelName">您的頻道名稱 (選填):</label>
        <input type="text" id="channelName" name="channelName" placeholder="例如:@MyChannelName">
        <div class="note">若填寫,將獲取所有回覆並標示您的留言;若留空,則只獲取頂層留言。</div>

        <label for="sheetName">工作表名稱 (選填):</label>
        <input type="text" id="sheetName" name="sheetName" placeholder="預設為影片標題">
        <div class="note">若未輸入,將自動使用影片標題作為工作表名稱,可自行縮短。</div>

        <div class="buttons">
          <button type="button" id="cancelButton" onclick="google.script.host.close()">取消</button>
          <button type="submit" id="submitButton">確定</button>
        </div>
      </form>

      <!-- 浮動 loading overlay -->
      <div class="loading-overlay" id="loadingOverlay">正在處理,請稍候...</div>

      <!-- 浮動 videoTitle overlay -->
      <div class="videoTitle-overlay" id="videoTitleOverlay">取得影片標題中...</div>
    </div>

    <script>
      let userModifiedSheetName = false;

      document.getElementById('sheetName').addEventListener('input', () => {
        userModifiedSheetName = true;
      });

      function fetchVideoTitle() {
        const videoId = document.getElementById('videoId').value.trim();
        if (!videoId) return;

        // 顯示浮動提示 → 防止誤操作
        const videoTitleOverlay = document.getElementById('videoTitleOverlay');
        videoTitleOverlay.textContent = '取得影片標題中...';
        videoTitleOverlay.classList.add('active');

        google.script.run
          .withSuccessHandler((title) => {
            if (!userModifiedSheetName && title) {
              document.getElementById('sheetName').value = title;
            }

            // 成功後隱藏浮動提示
            videoTitleOverlay.classList.remove('active');
          })
          .withFailureHandler((error) => {
            console.error('取得影片標題失敗:', error);

            // 失敗顯示錯誤,2 秒後隱藏
            videoTitleOverlay.textContent = '取得影片標題失敗';
            setTimeout(() => {
              videoTitleOverlay.classList.remove('active');
            }, 2000);
          })
          .getVideoTitleById(videoId);
      }

      function onFormSuccess() {
        console.log("數據已成功傳送至 Apps Script。");
        google.script.host.close();
      }

      function onFormFailure(error) {
        console.error("將數據傳送至 Apps Script 時發生錯誤:", error);
        alert("資料傳送失敗,請檢查 Apps Script 日誌。\n錯誤: " + error.message);
        google.script.host.close();
      }

      function submitForm(e) {
        e.preventDefault();
        const videoId = document.getElementById('videoId').value;
        const channelName = document.getElementById('channelName').value;
        const sheetName = document.getElementById('sheetName').value;

        if (!videoId) {
          alert("請輸入影片 ID!");
          return;
        }

        const formData = {
          videoId: videoId,
          channelName: channelName,
          sheetName: sheetName
        };
        console.log("提交表單數據:", formData);

        // 顯示浮動 loading
        document.getElementById('loadingOverlay').classList.add('active');
        document.getElementById('submitButton').disabled = true;
        document.getElementById('cancelButton').disabled = true;

        google.script.run
          .withSuccessHandler(onFormSuccess)
          .withFailureHandler(onFormFailure)
          .processFormDataFromHtml(formData);
      }
    </script>
  </body>
</html>

這個 HTML 的檔案,用來顯示擷取留言的設定選項對話框,包含了影片ID頻道名稱(選填)和工作表的標題(也是選填,預設會自動以影片的標題為主)。

儲存專案,完成!

當上面的這兩個程式碼、HTML檔案都完成複製貼上之後,記得要存檔,同時重新命名這個專案,例如:『YouTube 留言擷取工具(或是任何名稱都可以,不影響程式運作)』。

接著結束 Apps Script 編輯器,重新載入這個 Google 試算表文件(按 Cmd+R 或 F5 鍵),重新載入後就會在功能表上,看到多一個『YouTube 留言工具』選單,這樣就全部完成了!

要怎麼使用這個 YouTube 留言擷取工具呢?

使用這個留言擷取工具很簡單,不過在第一次執行時,程式碼會跳出需要授權的訊息,按下確定,進行後續授權的作業(多半都是同意、同意...),授權完成後就可以開始用了,這個授權只會出現這一次,以後都不會再跳出來了

那麼使用這個 YouTube 留言擷取工具的方法如下:

點擊功能表上的 YouTube 留言工具
點擊功能表上的 YouTube 留言工具
  1. 點選「YouTube 留言工具」選單 >「獲取影片留言」子選單
  2. 填寫對話框
    • 影片 ID:YouTube 影片網址最後那一段像亂碼的就是影片 ID(例如 dQs4w_WgXAQ)
    • 頻道名稱(選填):填入頻道名稱(@開頭的那一組),如果留空,那麼工具就只會擷取第一層的留言,若是填入正確的頻道名稱,就會擷取回覆的留言並標示出自己的回覆。
    • 工作表名稱(選填):在填入影片ID後,系統會自動取得影片標題作為工作表的名稱,你可以自行編輯,以防影片名稱太長,讓工作表不易閱讀,如果把標題欄位刪除留空的話,那麼系統會以預設的名稱 YouTube Comments 來命名工作表。
  3. 擷取留言
    • 相關欄位都填妥後,點擊「確定」。
    • 工具就會自動呼叫 API 擷取留言:如果留言非常多(幾千上萬則),那麼等待的時間會比較長,這是正常的。
    • 完成後,留言就會出現在你指定的工作表中
YouTube 留言擷取工具對話框
YouTube 留言擷取工具對話框

關於這個 YouTube 留言擷取工具

這個 YouTube 留言擷取工具安裝非常容易,就是複製貼上兩個項目,也不需要事先申請 Google API 金鑰,使用起來也相當簡單,接下來我們聊一下關於這個工具大家可能會有疑問的幾個小地方:

這個工具為什麼不用申請 API 金鑰?

大家可能很好奇,為什麼用這個工具去抓 YouTube 的影片留言不需要去 Google 開發者平台申請「API 金鑰」呢?這不是必要的步驟嗎?

理論上是這樣沒錯,但由於這個小工具是綁定在 Google Sheet 裡面,使用 Apps Script 設計的,想像一下,Google Sheet 就像是 Google 公司內部的一小單位。而這個 Apps Script 程式碼,就好像是這小單位裡的一個專員,專門來幫你做事。

這個「內部專員」本身就有權限去公司的各個部門(像是 YouTube 部門、Google Sheet 部門)申請資料、處理業務。因為他就是 Google 自己人,所以第一次運行 Apps Script,然後點「同意授權」的時候,實際上就是給了這個「內部專員」一張你的個人授權書,允許他代表你去 YouTube 部門拿影片留言,去 Google Sheet 部門整理表格,所以不需要額外去申請「API 金鑰」Google 自己會搞定那些複雜的身份驗證

那麼這個工具有使用額度嗎?

有的,這部分其實跟使用「API 金鑰」一樣,都有一些使用上的限制,這個額度主要來自兩個地方:

  • Apps Script 本身的執行時間限制:就是這個腳本一天總共能跑多久(一天最多 90 分鐘),單次能跑多久(通常單次不超過 6 分鐘)。
  • YouTube Data API 的「點數」額度:預設情況下,每天有 10,000 點的 YouTube API 額度。

而這個程式碼所用到的「擷取並列出留言」的請求,每次只會消耗 1 點,即便每天抓一萬條留言,Apps Script 每次送出的查詢,單次最多回傳 100 條,所以要回傳到一萬則留言,程式碼大概需要送出 100 次查詢,那麼這樣也只會用掉 100 點
對於大多數個人使用情況來說,這個預設的 10,000 點額度是綽綽有餘的,幾乎不用擔心會「刷爆」。

在第一次使用時,授權中有一些看起來很危險的項目,像是授權刪除影片?

進行授權請求
進行授權請求

沒錯喔!在進行 Apps Script 授權時,的確會看到一些感覺很「危險」的權限,像是「刪除影片、留言」等,但是不用擔心,這些不會發生的。

授權提示之所以會顯示這些危險的權限,是因為 Google 在進行授權請求時,通常會列出所使用的 API 服務『可能』擁有的最大權限範圍。而不是這個 Apps Script『實際』會執行什麼操作

由於這個小工具使用了 YouTube Data API v3 服務,這個 API 具有從讀取、寫入、更新、到刪除影片或留言等等的能力。所以當 Apps Script 請求授權時,它會基於添加的服務來判斷。即使程式碼只用了「讀取 (Read-only)」功能,Apps Script 還是會顯示整個服務所涵蓋的最廣泛的權限提示。

這個工具可以擷取其他頻道的影片留言嗎?還是只能擷取自己的?

這個工具可以擷取任何人的 YouTube 頻道中,上傳的所有公開影片的留言,不僅僅是你自己的頻道。

主要是因為 YouTube 影片的留言被視為公開資料,即便不使用這些工具,任何人都可以在 YouTube 網站上直接觀看和閱讀影片的留言一樣,只要你的 Apps Script 程式碼獲得了存取 YouTube Data API 的權限,它就能夠去「讀取」這些公開的留言。

而非公開的資料,像是未公開或是私人影片的留言、頻道內部數據、後台設定等等,就無法透過這種層次的工具取得,即便是你自己的頻道,也無法透過這個工具來取得。

YouTube 留言擷取工具進階應用

將 YouTube 影片留言直接匯入 Google 試算表,不只是單純的備份動作,更是將原本分散、非結構化的留言內容,轉化為可以進行深度分析與應用的寶貴數據資產。當留言變成結構化資料,應用場景將變得非常多元:

首先,在提升內容品質層面,你可以針對留言進行情緒分析,快速掌握觀眾對影片、產品或議題的整體態度,及早發現潛在的公關危機或熱門話題。透過分析留言中反覆出現的關鍵字常見問題,可自動整理成 FAQ,還能找出影片中最受歡迎、最有討論度或最需改進的內容熱點,進一步優化未來的創作方向。

其次,在強化社群經營方面,這些留言數據堪稱黃金資料庫。你可以辨識出最活躍、最具貢獻度的核心粉絲,針對性地建立互動與關係,提升社群凝聚力。對於大量留言,還能建立系統化的待回覆清單,追蹤回覆進度,優化你的社群互動流程,甚至可作為輕量化的客服工具,確保粉絲問題獲得妥善回應。

此外,這項工具同樣可以應用於調整行銷策略競品觀眾洞察。你可以擷取並分析競爭對手或是同行頻道中公開影片的留言,洞察他們的觀眾反應、熱門話題、內容痛點,挖掘市場機會與創作靈感,協助調整自己的行銷佈局。

小結

這是一個輕巧實用的 YouTube 留言擷取工具,完全免費、自己掌控數據。

希望這篇文章有幫助你順利擷取頻道留言!開抓