SEO 工作會帶來一些有趣的挑戰,我相信你們都曾在某個時候面臨過這些挑戰。
您是靈活性和管理繁瑣任務的大師。 我最近發現自己正在與 100 多個頂級網站打交道。
與跨國公司合作是一個相當大的難題:
- 搜尋 100 多個網站的資料。
- 追蹤每個站點的效能。
由於其中一些網站在 Google 第一頁上相互競爭,因此網站 1 的流量很可能會下降,但網站 2 會承受損失。
檢查網站的 Google Search Console (GSC) 很簡單,但對於全球範圍內的數百個網站而言,這非常耗時。
你能做什麼?
我想出了一個連接到 GSC API 的 Google Sheets Apps 腳本,將全球報告從一項可能需要數天或數週的艱鉅任務轉變為只需要幾分鐘的任務。
建立腳本後,我可以輕鬆輸入日期範圍並提取每個網站:
- 點擊次數和展示次數。
- 關鍵字。
- 平均收視率。
- ETC。
由於我們管理數百個網站,因此用戶最終訪問我們的網站之一進行購買的情況並不少見,如上所述。
從長遠來看,全局比單一站點的性能更重要。
我將向你展示的是我的 10步驟流程 建立一個拉取的腳本 點擊次數和展示次數 然後年復一年(每年)比較一切。
建立 Google Sheets Apps 腳本以產生數百個網站報告的 10 步驟流程
第 1 步:建立您的 Google 表格
第一步是建立原始的 Google 試算表檔案。 您可以按照以下步驟進行操作:
- 前往谷歌雲端硬碟。
- 導航到要放置文件的資料夾。
- 右鍵點擊 背景
- 選擇 > Google 試算表 > 空白表。
您想要重新命名該檔案。 我將我的報告稱為「全球搜尋控制台報告」。
您的文件現已設定完畢,您可以進行下一步了。
第 2 步:設定您的 Google 表格
在您為第 1 行添加一些標題之前,空白工作表沒有用處,並且對使用者沒有任何意義。
- 網站
- 利基
- 點擊次數
- 印象數
- 每年的點擊次數。
- 印象同比。
- 點擊率差異。
- 展示次數差異百分比。
您的文件現在應如下所示:
下一步是建立一個 Google Cloud 項目,這也非常簡單明了。
第 3 步:建立 Google Cloud Console 資料項目
創建專案應該是免費的,因為 Google 提供 300 美元的信用來測試他們的平台。 如果您尚未使用過 Google Cloud,可以在 https://console.cloud.google.com/ 找到它。
現在您可以按照以下步驟操作:
- 龍頭 選擇項目 > 新項目。
- 輸入項目名稱(例如:「我的 GSC 資料項目」)。
- 龍頭 創造。
- 點選 選擇項目。
- 選擇您的項目。
- 點擊頂部 搜尋 酒吧。
- 輸入「Google 搜尋控制台 API」。」
- 選擇 「Google 搜尋控制台 API」。
- 點選 積極的
步驟 4:在 Google 試算表中建立應用程式腳本
在此步驟中,我們將致力於將 Apps 腳本整合到您先前建立的 Google 試算表中。 您需要打開該工作表並按照以下步驟操作:
- 龍頭 擴充 > 應用程式腳本。
我不會詳細介紹該腳本的工作原理,但您可以複製以下程式碼:
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Search Console')
.addItem('Fetch Data', 'menuItem1')
.addToUi();
}
function menuItem1() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sheet.getLastRow(); // Find the last row with data in column A
// Clear cells C2:F151 before processing data
sheet.getRange("C2:F151").clearContent();
for (var i = 2; i <= lastRow; i++) { var siteProperty = sheet.getRange(i, 1).getValue(); var startDateValue = sheet.getRange('M1').getValue(); var endDateValue = sheet.getRange('M2').getValue(); var timeZone = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(); var format = "yyyy-MM-dd"; // Calculate dates for last year var lastYearStartDate = new Date(startDateValue); lastYearStartDate.setFullYear(lastYearStartDate.getFullYear() - 1); var lastYearEndDate = new Date(endDateValue); lastYearEndDate.setFullYear(lastYearEndDate.getFullYear() - 1); var startDate = Utilities.formatDate(lastYearStartDate, timeZone, format); var endDate = Utilities.formatDate(lastYearEndDate, timeZone, format); // Fetch data for the previous year var previousYearResponse = requestSearchConsoleAPI(siteProperty, startDate, endDate); // Fetch data for the current year (unchanged) startDate = Utilities.formatDate(new Date(startDateValue), timeZone, format); endDate = Utilities.formatDate(new Date(endDateValue), timeZone, format); var currentYearResponse = requestSearchConsoleAPI(siteProperty, startDate, endDate); // Process and write data for both years processAndWriteData(sheet, i, previousYearResponse, currentYearResponse); } } function processAndWriteData(sheet, row, previousYearResponse, currentYearResponse) { // Check if response is not defined or null and has at least one row if (previousYearResponse && previousYearResponse.length > 0) {
var previousYearClicks = 0;
var previousYearImpressions = 0;
previousYearResponse.forEach(function(row) {
previousYearClicks += row.clicks;
previousYearImpressions += row.impressions;
});
sheet.getRange(row, 5).setValue(previousYearClicks); // Write to column D (index 5)
sheet.getRange(row, 6).setValue(previousYearImpressions); // Write to column E (index 6)
} else {
Logger.log('No data found for previous year in row: ' + row);
}
// Process and write data for the current year
if (currentYearResponse && currentYearResponse.length > 0) {
var currentYearClicks = 0;
var currentYearImpressions = 0;
currentYearResponse.forEach(function(row) {
currentYearClicks += row.clicks;
currentYearImpressions += row.impressions;
});
sheet.getRange(row, 3).setValue(currentYearClicks); // Write to column C (index 3)
sheet.getRange(row, 4).setValue(currentYearImpressions); // Write to column D (index 4)
} else {
Logger.log('No data found for current year in row: ' + row);
}
}
function requestSearchConsoleAPI(siteProperty, startDate, endDate) {
try {
const oauthToken = ScriptApp.getOAuthToken(); // Correctly call the method
const siteUrl = siteProperty;
const url="https://www.googleapis.com/webmasters/v3/sites/" + encodeURIComponent(siteUrl) + '/searchAnalytics/query';
const payload = {
startDate: startDate,
endDate: endDate,
type: 'web'
};
const headers = {
'Authorization': 'Bearer ' + oauthToken,
'Content-Type': 'application/json'
};
const options = {
'method': 'post',
'contentType': 'application/json', // Consistent content type
'headers': headers,
'payload': JSON.stringify(payload),
'muteHttpExceptions': true
};
const response = UrlFetchApp.fetch(url, options);
const responseCode = response.getResponseCode();
const contentText = response.getContentText(); // Get response text for logging
Logger.log('Response Code: ${responseCode}'); // Use backticks
Logger.log('Response Content: ${contentText}'); // Use backticks
if (responseCode === 200) {
const json = JSON.parse(contentText);
Logger.log(json); // This will log the actual JSON response
return json.rows; // Adjust this line based on the actual structure of your API response
} else {
// Correctly use backticks here for template literals
const errorMessage="Error fetching data: ${responseCode} - ${contentText}";
Logger.log(errorMessage);
throw new Error(errorMessage);
}
} catch (e) {
Logger.log('Error: ${e.toString()}');
return null;
}
}
然後返回您的 Apps 腳本項目並執行以下操作:
- 按 CTRL+A 選擇全部。
- 按 CTRL+V 貼上您複製的程式碼。
- 龍頭 好的。
- 點選 保存項目。
- 龍頭 跑步。
*筆記: 如果您收到來自 Google 的錯誤請求錯誤(重定向次數過多),那是因為您啟動了多個帳戶。 嘗試使用僅登入一個 Google 帳戶的瀏覽器。
系統會提示您 審核權限 您需要選擇與 Google Search Console 相關的 Google 帳戶。
Google 會警告您該應用程式尚未經過驗證,因此只需點擊 “先進的” 設定然後 “轉到無標題項目(不安全)。”
最後,您可以透過點擊或點擊來完成此步驟 允許 按鈕
第 5 步:設定您的登入憑證
我知道表格和 Google Cloud Console 之間有很多來回,但不幸的是,目前這是必要的。 現在,我們將設定您的登入憑證,這將要求您返回 Google Cloud Console。
筆記: 你必須有 能力 上一個步驟中的 Google Search Console API。
螢幕應如下圖所示:
您將需要:
- 龍頭 憑證 > 建立憑證。
- 龍頭 OAuth 用戶端 ID > 設定同意畫面。
- 點選 外部的
- 龍頭 創造。
- 進來 “我的 GSC 數據” 例如應用程式的名稱。
- 添加您的 支援電子郵件 (您用於 GSC 的電子郵件)。
- 添加您的 d開發商聯絡資訊 (您用於 GSC 的電子郵件)。
- 龍頭 保存並繼續。
- 龍頭 新增或刪除範圍。
- 檢查 2 個 谷歌搜尋控制台API 區域(可能位於第 2 頁)。
- 點選 更新
- 點選 保存並繼續。
- 現在點擊 新增用戶
- 您可以新增多個用戶,最好是有權存取 GSC 的用戶。
- 保存並繼續。
第 6 步:為 GSC 資料設定 Google Cloud 項目
當我們仍在進行 Google Cloud 專案時,您需要點擊 漢堡圖示 並前往 雲端概述 > 儀表板:
您會注意到它顯示“項目編號”,您應該選擇它並 複製 緊迫 CTRL+C。
返回您的 Apps 腳本標籤並點擊 項目設定:
前往標題部分 谷歌雲端平台(GCP)計畫。將項目編號 (CTRL + V) 貼上到文字方塊中,然後按一下 建立專案
步驟 7: 重新命名您的 Google Apps 腳本
現在您需要重新命名您的 Apps 腳本,方法是: 專案歷史 像這樣:
然後:
- 點選 無標題項目 在螢幕頂部。
- 進來 「我的 GSC 資料專案腳本」。
- 點選 更改名稱。
步驟 8:編輯 Code.gs 腳本的 Google Apps 清單文件
你仍然停留在你的劇本中,我們會回來討論這個 專案配置 就像我們之前所做的那樣。
這次,您需要點擊 在編輯器中顯示“appsscript.json”清單文件 以確保其旁邊有復選標記。
然後點擊 編輯 並導航至 應用程式腳本.json您可以在下面看到:
您想要刪除 appsscript.json 檔案中的所有內容並貼上以下腳本:
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"oauthScopes": [
"https://www.googleapis.com/auth/webmasters",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/spreadsheets.currentonly"
]
}
添加代碼後,您可以單擊 代碼.gs 文件並點擊 節省, 進而 跑步。 系統將提示您檢查權限,並需要選擇適當的帳戶才能繼續使用它。
出現幾次提示後,系統將要求您授權「我的 GSC 資料」應用程序,它將開始運行。
第9步:調整網站資料分析的日期
在您的 Google 試算表檔案中,您需要新增以下內容:
- L1:初始日期。
- L2: 完成日期。
筆記:開始和結束日期必須在中指定 M1 我 M2。 例如,您可以輸入:
筆記:日期格式可能會有所不同,具體取決於您的系統配置和位置。
步驟 10:為小於零的非空白儲存格設定條件格式
一切都已設定完畢,但您應該添加一些條件格式以使其看起來更好。 我們將重點放在「點擊差異百分比」和「展示差異百分比」欄位:
選擇「點選差異百分比」和「展示差異百分比」標題下的行,然後點選 格式 > 條件格式。 在下面 格式規則, 你會想要選擇 少於。
在“值或公式”文字區域中,您可以新增 0。
其作用是,如果它小於 0,我們會將顏色更改為紅色,因為它是負數並且丟失了流量。 您可以透過點擊油漆罐並更改它來完成此操作 紅色的 在按一下“完成”之前。
如果您想將流量的正增長更改為綠色,您需要添加另一條規則 大於 並添加 0 價值
以下是 G2 和 H2 中使用的公式(您可以為每一行複製它們 – 只需單擊並向下拖動其他行):
=IFERROR(IF(AND(C2<>"",E2<>""), (C2-E2)/E2, ""),"")
=IFERROR(IF(AND(D2<>"",F2<>""), (D2-F2)/F2, ""),"")
現在,您可以輕鬆地在多個位置同時執行報表。
就是這樣,您就有了全球報告
在 A 欄中,輸入您的 Google Search Console 屬性; 如果它是網域屬性,請將其新增為 domain-sc:example.com 或將 URL 屬性新增為 https://example.com
若要運行或更新報告,請使用特殊選單 搜尋控制台 > 擷取資料:
*筆記: 該腳本支援大約 150 個網域,但如果您需要更多網域,可以調整 AppScripts 檔案的第 14 行:
sheet.getRange("C2:F151").clearContent();
使用相同的教程,您可以輕鬆地將數天的資料收集和報告執行時間縮短為幾分鐘。 您甚至可以擴展腳本來執行其他計算或為報告收集更多資料。
請參閱我關於將 ChatGPT 與 Google Sheets 整合的其他教學。
自動化報告是簡化繁瑣任務的好方法,我希望它能讓您的工作變得更輕鬆。
更多資源:
特色圖片:200dgr /Shutterstock