تحلیل سئوی یک سایت معمولاً زمان بر است، اما با اتوماسیون تحلیل سئو به وسیله هوش مصنوعی میتوان این فرآیند را سرعت بخشید. در این مقاله، نحوه ساخت یک ابزار سفارشی برای انجام بهینه سازی سئو و دریافت تحلیلهای مبتنی بر هوش مصنوعی با استفاده از گوگل شیت، گوگل سرچ کنسول و ChatGPT API توضیح داده شده است. این ابزار به شما کمک میکند تا دادههای گوگل سرچ کنسول را بهطور خودکار استخراج کنید و از هوش مصنوعی برای دریافت تحلیلهای دقیقتر و بهبود عملکرد سایت استفاده کنید.
مزایای استفاده از اتوماسیون تحلیل سئو
با استفاده از اتوماسیون تحلیل سئو، شما قادر خواهید بود:
دریافت خودکار دادههای گوگل سرچ کنسول را برای تحلیل بهتر سرعت ببخشید.
از هوش مصنوعی برای تولید توصیههای عملی در زمینهی سئو بهره گیری کنید.
این ابزار چگونه کار میکند؟
به زبان ساده تر شما یک URL را از دامنهای که به گوگل سرچ کنسول متصل است انتخاب میکنید، کلید API ChatGPT را وارد میکنید، صفحه را بررسی میکنید و تحلیل سئو مبتنی بر هوش مصنوعی را مستقیما وارد گوگل شیت می کنید.
اتوماسیون تحلیل سئو شامل چه بخشهایی میشود؟
پس از تنظیم این ابزار، میتوانید به سرعت دادههای کلیدی سئو را از گوگل سرچ کنسول دریافت کنید که این داده ها شامل:
- رتبهبندی کلمات کلیدی
- • URLهای لینک دهنده و بک لینک ها
- تاریخ آخرین خزش رباتهای گوگل
- وضعیت ایندکس در فایل robots.txt
همچنین، ChatGPT با تحلیل کامل صفحه، توصیههایی برای بهینهسازی بخشهای زیر ارائه میدهد:
- تگهای عنوان (Title Tags)
- توضیحات متا (Meta Descriptions)
- تگهای هدینگ (Heading Tags)
- محتوای صفحه
- جایگذاری کلمات کلیدی
- لینکسازی داخلی
- بهینهسازی موبایل
- سئوی محلی (Local SEO)
- نشانهگذاری اسکیما (Schema Markup)
لازم به ذکر است که این ابزار همهی موارد را بصورت جامع پوشش نمیدهد، اما در عرض چند ثانیه نتایج قابل توجهی ارائه میکند و باعث صرفه جویی در ساعتها کارهای یک متخصص سئو وسئو کار میشود.
مراحل راه اندازی اتوماسیون تحلیل سئو
راهاندازی این ابزار ممکن است در ابتدا کمی پیچیده به نظر برسد، اما ما در این راهنمای جامع با بررسی قدم به قدم تمامی مراحل آموزشی کامل در اختیار شما قرار داده ایم که با رعایت تمامی مراحل، میتوانید آن را بهدرستی اجرا کنید.
مرحله 1: ساخت گوگل شیت برای اتوماسیون تحلیل سئو
اگر حساب کاربری گوگل دارید، انجام این کار بسیار ساده است. کافیست مراحل زیر را دنبال کنید:
باز کردن گوگل درایو: ابتدا وارد حساب گوگل خود شوید و به گوگل درایو بروید.
رفتن به پوشه مورد نظر: وارد پوشهای شوید که میخواهید ابزار خود را در آن قرار دهید.
کلیک راست بر روی فضای خالی: در قسمت خالی صفحه، روی پسزمینه (فضای سفید) راستکلیک کنید.
انتخاب Google Sheets: از منوی باز شده، گزینهی Google Sheets و سپس Blank spreadsheet را انتخاب کنید.
نامگذاری شیت: میتوانید به شیت خود هر نامی که دوست دارید بدهید. من برای نمونه نام «wint seo» را انتخاب کردهام، اما شما میتوانید هر نام دلخواهی انتخاب کنید.
حالا شما یک شیت خالی آماده دارید که میتوانید از آن برای ساخت ابزار سفارشی خود استفاده کنید.
مرحله 2: پر کردن شیت
وارد کردن کلید API چتجیپیتی:
ابتدا باید کلید API چتجیپیتی خودتون رو وارد کنید. برای این کار، در سلول D1 کلیک کنید و کلید API که از سایت چتجیپیتی دریافت کردهاید، در آن وارد کنید. اگر هنوز این کلید رو ندارید، باید به سایت OpenAI برید و یک کلید API برای خودتون بگیرید.
ادغام ردیفها در ستونهای F و G: حالا باید ردیفهای دو ستون F و G را ادغام کنید تا فضای مناسب برای ورود دادهها فراهم بشه. برای این کار:
انتخاب ردیفها: ابتدا باید ردیفهای F2 تا F30 رو انتخاب کنید. برای این کار، روی سلول F2 کلیک کنید و دکمهی Shift رو نگه دارید، سپس روی سلول F30 کلیک کنید تا همه ردیفها از F2 تا F30 انتخاب بشن.
ادغام ردیفها: بعد از انتخاب این ردیفها، بالای صفحه گزینهی Format رو پیدا کنید و روی اون کلیک کنید. در منوی باز شده، گزینه Merge cells رو انتخاب کنید. بعد از اون، روی Merge vertically کلیک کنید تا ردیفهای انتخابی به صورت عمودی ادغام بشن.
تکرار برای ستون G: حالا همون کار رو برای ستون G انجام بدید. یعنی ردیفهای G2 تا G30 رو انتخاب کنید و بعد همون مراحل ادغام رو برای این ستون هم تکرار کنید.
با این کار، شما فضای مورد نیاز رو برای پر کردن دادهها بهصورت مرتب و منظم آماده میکنید. امیدوارم حالا توضیحات واضحتر شده باشه!
مرحله 3: ایجاد پروژه در Google Cloud
در این مرحله باید یک پروژه جدید در گوگل کلود برای ابزار خود بسازید تا بتونید از API گوگل سرچ کنسول استفاده کنید. مراحل این کار رو به شکل ساده و واضح توضیح میدم:
ایجاد یک پروژه جدید در گوگل کلود
- به آدرس Google Cloud Console بروید.
- در گوشه بالای صفحه، روی گزینهی “Select Project” کلیک کنید.
- سپس گزینهی “New Project” رو انتخاب کنید تا بتونید یک پروژه جدید بسازید.
- در صفحهی باز شده، برای پروژهتون یک نام انتخاب کنید. مثل نام پروژه “wint seo”.
- بعد از وارد کردن نام، روی دکمهی “Create” کلیک کنید تا پروژه ایجاد بشه.
فعالسازی API گوگل سرچ کنسول
حالا باید API گوگل سرچ کنسول رو برای پروژهتون فعال کنید. برای این کار، در نوار جستجو بالای صفحه در کنسول گوگل کلود، عبارت “Google Search Console API” رو تایپ کنید.
وقتی این گزینه رو پیدا کردید، روی اون کلیک کنید. در صفحهی باز شده، روی دکمهی “Enable” کلیک کنید تا این API برای پروژه شما فعال بشه.
ادامه کار:
حالا پروژه شما ساخته شده و API گوگل سرچ کنسول هم فعال شده. البته هنوز کارهای دیگهای باید انجام بدید که ادامه میدهیم.
با انجام این مراحل، شما پروژهی گوگل کلود خودتون رو آماده کردید و میتونید از API گوگل سرچ کنسول برای استخراج دادهها استفاده کنید.
مرحله 4: افزودن دسترسیها و اعتبارنامهها
در این مرحله باید دسترسیها و اعتبارنامههای لازم رو برای پروژه خود در گوگل کلود اضافه کنید. این مراحل به شما کمک میکنه تا ابزار شما بتونه از API گوگل سرچ کنسول استفاده کنه. برای انجام این کار، مراحل زیر رو دنبال کنید:
بازگشت به کنسول گوگل کلود:
به کنسول گوگل کلود خود برگردید و به بخش “Credentials” در سمت چپ صفحه بروید. حالا باید یک اعتبار نامه جدید ایجاد نمایید که در ادامه فرایند آن را بیان مینماییم
ایجاد اعتبارنامه جدید:
در بالای صفحه، روی دکمهی “+ Create Credentials” کلیک کنید.
سپس گزینه “OAuth client ID” رو انتخاب کنید.
پیکربندی صفحه تاییدیه (Consent Screen):
بعد از انتخاب OAuth client ID، باید صفحه تاییدیه رو تنظیم کنید. برای این کار، به قسمت Configure Consent Screen بروید و گزینه External رو انتخاب کنید.
حالا صفحه تاییدیه رو بسازید و اطلاعات زیر رو وارد کنید:
App Name: نام مورد نظر رو وارد کنید.
Support Email: ایمیل پشتیبانی که به حساب گوگل سرچ کنسول شما متصل است، وارد کنید.
Developer Contact Information: اطلاعات تماس شخص مورد نظر (مثل ایمیل یا شماره تماس) رو وارد کنید.
تنظیم دسترسیها (Scopes):
بعد از وارد کردن اطلاعات، روی Save and Continue کلیک کنید.
در صفحه بعدی که با عنوان Add or Remove Scopes نمایش داده میشه، باید دسترسیهای مربوط به Google Search Console API رو انتخاب کنید.
بعد از انتخاب دسترسیها، روی Update کلیک کنید و سپس Save and Continue رو بزنید.
افزودن کاربران و ذخیره تنظیمات:
در این مرحله، میتونید کاربرانی که میخواهید به ابزار شما دسترسی داشته باشند، اضافه کنید.
پس از افزودن کاربران، روی Save and Continue کلیک کنید تا تنظیمات شما ذخیره بشه.
با انجام این مراحل، شما دسترسیهای لازم برای استفاده از API گوگل سرچ کنسول رو برای پروژهتون تنظیم کردید.
مرحله 5: تغییر به پروژه گوگل کلود برای دادههای GSC
در این مرحله باید پروژه گوگل کلود خود را برای استفاده از دادههای گوگل سرچ کنسول تنظیم کنید. برای انجام این کار، مراحل زیر رو دنبال کنید:
رفتن به داشبورد پروژه:
- ابتدا روی آیکون Hamburger (سه خط افقی) در بالا سمت چپ صفحه کلیک کنید تا منوی کناری باز بشه.
- از منوی باز شده به بخش Cloud Overview بروید و سپس روی Dashboard کلیک کنید.
کپی کردن شماره پروژه:
- در صفحه Dashboard، شماره پروژه شما نمایش داده میشه. این شماره رو باید کپی کنید.
- به قسمت Project number بروید، روی اون کلیک کنید و با استفاده از CTRL + C شماره پروژه رو کپی کنید.
رفتن به گوگل شیت:
- حالا به فایل گوگل شیت خود برگردید.
- در شیت، روی آیکون چرخ دنده (Gear icon) که مربوط به Project Settings هست، کلیک کنید.
چسباندن شماره پروژه:
- در بخش تنظیمات پروژه، شماره پروژهای که کپی کردید رو در کادر متنی وارد کنید.
- بعد از وارد کردن شماره پروژه، روی Set project کلیک کنید.
با این کار، پروژه شما برای استفاده از دادههای گوگل سرچ کنسول در گوگل شیت تنظیم خواهد شد.
مرحله 6: نامگذاری اسکریپت گوگل اپس
در این مرحله باید برای اسکریپت خود یک نام انتخاب کنید تا بتونید کارها رو مرتبتر انجام بدید. برای این کار، مراحل زیر رو دنبال کنید:
رفتن به بخش تاریخچه پروژه:
در گوگل شیت خود، به بخش Project History بروید.
نامگذاری پروژه:
- در قسمت بالای صفحه، روی نوشته “Untitled project” کلیک کنید.
- حالا نام “GSC Custom Tool” رو وارد کنید یا هر نام دلخواهی که میخواهید برای اسکریپت خود انتخاب کنید.
- با این کار، اسکریپت شما با نامی مشخص ذخیره میشود و کار شما مرتبتر میشود.
مرحله 7: ویرایش فایل منیفست
در این مرحله باید اسکریپت اپلیکیشنهای گوگل رو به شیت جدید خود اضافه کنید و فایل منیفست رو ویرایش کنید. برای این کار، مراحل زیر رو دنبال کنید:
باز کردن اسکریپت اپلیکیشن گوگل:
در فایل گوگل شیت خود، به منوی Extensions بروید و گزینه Apps Script رو انتخاب کنید. این کار شما رو به محیط ویرایش اسکریپت هدایت میکنه.
کپی و جایگذاری کد منیفست:
در محیط اسکریپت، کد زیر رو که مربوط به تنظیمات منیفست هست، کپی کنید:
{ "timeZone": "America/New_York", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "oauthScopes": [ "https://www.googleapis.com/auth/webmasters", "https://www.googleapis.com/auth/webmasters.readonly", "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/spreadsheets.currentonly" ], "runtimeVersion": "V8"}
وارد کردن کد در اسکریپت:
- حالا به محیط ویرایش اسکریپت برگشته و کد رو در فایل اسکریپت خود با استفاده از CTRL + V کپی کنید.
- با این کار، شما تنظیمات منیفست را به درستی اضافه کردهاید و آمادهاید که از قابلیتهای API گوگل سرچ کنسول در شیت خود استفاده کنید.
مرحله 8: یک برنامه اسکریپت ایجاد کنید
پس از اینکه همه چیز را در آن جایگذاری کردید، به فایل Code.js رفته و این کد را جایگذاری میکنید:
// Store the OAuth token and logs in script properties
const scriptProperties = PropertiesService.getScriptProperties();
const OPENAI_URL = “https://api.openai.com/v1/chat/completions”;
const SYSTEM_MESSAGE = { role: “system”, content: “You are a helpful SEO expert.” };
function log(message) {
Logger.log(message); // Regular Apps Script logging
const logs = scriptProperties.getProperty(‘customLogs’) || ”;
scriptProperties.setProperty(‘customLogs’, logs + ‘\n’ + message); // Append message to logs
}
function resetLogs() {
scriptProperties.deleteProperty(‘customLogs’); // Clear logs for a new execution
}
function getLogs() {
return scriptProperties.getProperty(‘customLogs’) || ‘No logs available.’;
}
function fetchOAuthToken() {
let token = scriptProperties.getProperty(‘oauthToken’);
if (!token) {
token = ScriptApp.getOAuthToken();
scriptProperties.setProperty(‘oauthToken’, token);
log(‘OAuth token fetched and stored.’);
}
return token;
}
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu(‘Search Console’)
.addItem(‘Authorize GSC’, ‘promptReauthorization’)
.addItem(‘Fetch GSC Properties’, ‘fetchGSCProperties’)
.addItem(‘Inspect URL’, ‘inspectUrl’) // Add the Inspect URL button
.addItem(‘AI Analyze’, ‘aiAnalyze’) // Add the AI Analyze button
.addToUi();
}
function promptReauthorization() {
const ui = SpreadsheetApp.getUi();
const response = ui.alert(
‘Re-authorize Script’,
‘Re-authorizing will revoke current permissions and require you to authorize again. Do you want to continue?’,
ui.ButtonSet.YES_NO
);
if (response === ui.Button.YES) {
try {
scriptProperties.deleteProperty(‘oauthToken’); // Clear old token
const token = fetchOAuthToken(); // Fetch and store new token
log(“OAuth Token: ” + token);
ui.alert(‘Authorization successful. No further action is required.’);
} catch (e) {
ui.alert(‘Authorization failed: ‘ + e.toString());
}
} else {
ui.alert(‘Re-authorization canceled.’);
}
}
function fetchGSCProperties() {
resetLogs();
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const oauthToken = fetchOAuthToken();
const sites = getSitesListFromGSC(oauthToken);
if (!sites || sites.length === 0) {
SpreadsheetApp.getUi().alert(‘No GSC properties found. Please ensure you have access to GSC properties.’);
return;
}
const siteUrls = [‘Select a property’].concat(
sites.map(site => site.siteUrl).sort()
);
sheet.getRange(‘A1’).setValue(‘Select GSC property’).setFontWeight(‘bold’);
sheet.getRange(‘B1’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList(siteUrls, true)
.build()
);
sheet.getRange(‘B1’).setValue(‘Select a property’).setFontWeight(‘bold’);
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 350);
}
let isProcessing = false; // Global flag to prevent recursive triggering
function onEdit(e) {
if (isProcessing) return; // Prevent re-entry during execution
isProcessing = true; // Set flag to true
try {
resetLogs();
const sheet = e.source.getActiveSheet();
const range = e.range;
// Always clear A3:D30 on edits to B1 or B2
if (range.getA1Notation() === ‘B1’ || range.getA1Notation() === ‘B2’) {
sheet.getRange(‘A3:D30’).clearContent();
sheet.getRange(‘F1:G30’).clearContent();
if (range.getA1Notation() === ‘B1’) {
const selectedProperty = range.getValue();
// Clear A2 and set loading state
sheet.getRange(‘A2’).setValue(‘Loading results…’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).clearContent();
if (selectedProperty === ‘Select a property’) {
sheet.getRange(‘A2’).clearContent();
sheet.getRange(‘B2’).clearContent();
return;
}
const oauthToken = fetchOAuthToken();
const urls = getUrlsForProperty(selectedProperty, oauthToken);
if (!urls || urls.length === 0) {
sheet.getRange(‘A2’).setValue(‘No URLs found’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).clearContent();
log(`No URLs found for property ${selectedProperty}`);
return;
}
sheet.getRange(‘A2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList([‘Select a URL’].concat(urls), true)
.build()
);
sheet.getRange(‘B2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
}
if (range.getA1Notation() === ‘B2’) {
const selectedProperty = sheet.getRange(‘B1’).getValue();
const selectedUrl = range.getValue();
if (selectedUrl === ‘Select a URL’) {
return;
}
sheet.getRange(‘A3’).setValue(‘Loading keywords…’).setFontWeight(‘bold’);
const oauthToken = fetchOAuthToken();
const keywords = getTopKeywordsForUrl(selectedProperty, selectedUrl, oauthToken);
if (!keywords || keywords.length === 0) {
sheet.getRange(‘A3’).setValue(‘No keywords found’).setFontWeight(‘bold’);
log(`No keywords found for URL ${selectedUrl}`);
return;
}
// Populate keywords and metrics
sheet.getRange(‘A3:D12’).clearContent(); // Clear any loading message
keywords.forEach((keyword, index) => {
if (index < 10) {
sheet.getRange(`A${3 + index}`).setValue(keyword.query).setFontWeight(‘bold’);
sheet.getRange(`B${3 + index}`).setValue(keyword.clicks);
sheet.getRange(`C${3 + index}`).setValue(keyword.impressions);
sheet.getRange(`D${3 + index}`).setValue(keyword.ctr);
}
});
}
}
} catch (error) {
log(`Error in onEdit: ${error}`);
} finally {
isProcessing = false; // Reset the flag after execution
}
}
function getApiRequestDetails(selectedProperty) {
const payload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
const apiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(selectedProperty)}/searchAnalytics/query`;
return { url: apiUrl, payload: payload };
}
function getSitesListFromGSC(oauthToken) {
try {
const url = ‘https://www.googleapis.com/webmasters/v3/sites’;
const headers = {
‘Authorization’: ‘Bearer ‘ + oauthToken,
‘Content-Type’: ‘application/json’
};
const options = {
method: ‘get’,
headers: headers,
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response Content: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
const json = JSON.parse(response.getContentText());
return json.siteEntry || [];
} else {
throw new Error(`Error fetching data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getUrlsForProperty(property, oauthToken) {
try {
const apiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
const payload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
const headers = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
const options = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
const json = JSON.parse(response.getContentText());
return json.rows ? json.rows.map(row => row.keys[0]) : [];
} else {
throw new Error(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getTopKeywordsForUrl(property, url, oauthToken) {
try {
const apiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
const payload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“query”],
dimensionFilterGroups: [
{
filters: [
{
dimension: “page”,
operator: “equals”,
expression: url
}
]
}
],
rowLimit: 10,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
const headers = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
const options = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
const json = JSON.parse(response.getContentText());
return json.rows ? json.rows.map(row => ({
query: row.keys[0],
clicks: row.clicks,
impressions: row.impressions,
ctr: row.ctr
})) : [];
} else {
throw new Error(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getToday() {
const today = new Date();
return today.toISOString().split(“T”)[0];
}
function getThreeMonthsAgo() {
const date = new Date();
date.setMonth(date.getMonth() – 3);
return date.toISOString().split(“T”)[0];
}
function inspectUrl() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const url = sheet.getRange(‘B2’).getValue();
const property = sheet.getRange(‘B1’).getValue();
// Clear previous inspection results in A15:D30
sheet.getRange(‘A15:D30’).clearContent();
sheet.getRange(‘A15’).setValue(‘Inspecting…’).setFontWeight(‘bold’);
if (!url || url === ‘Select a URL’) {
SpreadsheetApp.getUi().alert(‘Please select a valid URL in cell B2 before inspecting.’);
sheet.getRange(‘A15’).setValue(‘No URL selected’).setFontWeight(‘bold’);
return;
}
const oauthToken = fetchOAuthToken();
try {
const result = callUrlInspectionApi(property, url, oauthToken);
// Extract fields from the response
const indexStatus = result.indexStatusResult || {};
const mobileUsability = result.mobileUsabilityResult || {};
const richResults = result.richResultsInfo || {};
const referringUrls = indexStatus.referringUrls?.join(‘, ‘) || ‘None’;
// Populate inspection results in the sheet
sheet.getRange(‘A15’).setValue(`Inspection Results`).setFontWeight(‘bold’);
sheet.getRange(‘A16’).setValue(`URL:`).setFontWeight(‘bold’);
sheet.getRange(‘B16’).setValue(url);
sheet.getRange(‘A17’).setValue(`Coverage:`).setFontWeight(‘bold’);
sheet.getRange(‘B17’).setValue(indexStatus.coverageState || ‘Unknown’);
sheet.getRange(‘A18’).setValue(`Robots.txt:`).setFontWeight(‘bold’);
sheet.getRange(‘B18’).setValue(indexStatus.robotsTxtState || ‘Unknown’);
sheet.getRange(‘A19’).setValue(`Indexing State:`).setFontWeight(‘bold’);
sheet.getRange(‘B19’).setValue(indexStatus.indexingState || ‘Unknown’);
sheet.getRange(‘A20’).setValue(`Last Crawled:`).setFontWeight(‘bold’);
sheet.getRange(‘B20’).setValue(indexStatus.lastCrawlTime || ‘Not Available’);
sheet.getRange(‘A21’).setValue(`Google Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B21’).setValue(indexStatus.googleCanonical || ‘Unknown’);
sheet.getRange(‘A22’).setValue(`User Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B22’).setValue(indexStatus.userCanonical || ‘Unknown’);
sheet.getRange(‘A23’).setValue(`Mobile Usability:`).setFontWeight(‘bold’);
sheet.getRange(‘B23’).setValue(mobileUsability.verdict || ‘Unknown’);
sheet.getRange(‘A24’).setValue(`Rich Results Eligibility:`).setFontWeight(‘bold’);
sheet.getRange(‘B24’).setValue(richResults.verdict || ‘Unknown’);
sheet.getRange(‘A25’).setValue(`Referring URLs:`).setFontWeight(‘bold’);
sheet.getRange(‘B25’).setValue(referringUrls);
// Log and alert full response for debugging
const fullResponse = JSON.stringify(result, null, 2);
log(`Full Inspection Result: ${fullResponse}`);
//SpreadsheetApp.getUi().alert(`Inspection Completed. Full Response:\n\n${fullResponse}`);
} catch (error) {
sheet.getRange(‘A15’).setValue(‘Inspection Failed’).setFontWeight(‘bold’);
log(`Error inspecting URL: ${error.message}`);
SpreadsheetApp.getUi().alert(`Error inspecting URL: ${error.message}\n\nLogs:\n${getLogs()}`);
}
}
function callUrlInspectionApi(property, url, oauthToken) {
const apiUrl = ‘https://searchconsole.googleapis.com/v1/urlInspection/index:inspect’;
const payload = {
siteUrl: property,
inspectionUrl: url,
languageCode: ‘en-US’
};
const headers = {
Authorization: `Bearer ${oauthToken}`,
‘Content-Type’: ‘application/json’
};
const options = {
method: ‘post’,
contentType: ‘application/json’,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
log(`API URL: ${apiUrl}`);
log(`Payload: ${JSON.stringify(payload)}`);
try {
const response = UrlFetchApp.fetch(apiUrl, options);
const responseCode = response.getResponseCode();
const responseText = response.getContentText();
log(`Response Code: ${responseCode}`);
log(`Response Content: ${responseText}`);
if (responseCode === 200) {
const jsonResponse = JSON.parse(responseText);
if (jsonResponse && jsonResponse.inspectionResult) {
return jsonResponse.inspectionResult;
} else {
log(`Unexpected API Response Structure: ${responseText}`);
throw new Error(‘Unexpected API response format. “inspectionResult” field is missing.’);
}
} else {
log(`Failed API Call: ${responseText}`);
throw new Error(`Failed to inspect URL. Response Code: ${responseCode}. Response: ${responseText}`);
}
} catch (error) {
log(`Error during API call: ${error}`);
throw new Error(`Error inspecting URL: ${error.message}`);
}
}
function callChatGPT(prompt, temperature = 0.9, maxTokens = 800, model = “gpt-3.5-turbo”) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const secretKey = sheet.getRange(‘D1’).getValue().trim(); // Retrieve the OpenAI API key from D1
if (!secretKey) {
throw new Error(“API Key is missing in cell D1. Please provide a valid OpenAI API key.”);
}
const payload = {
model: model,
messages: [
SYSTEM_MESSAGE,
{ role: “user”, content: prompt }
],
temperature: temperature,
max_tokens: maxTokens
};
const options = {
method: “POST”,
headers: {
“Content-Type”: “application/json”,
“Authorization”: “Bearer ” + secretKey
},
payload: JSON.stringify(payload)
};
try {
const response = UrlFetchApp.fetch(OPENAI_URL, options);
const responseData = JSON.parse(response.getContentText());
if (responseData.choices && responseData.choices[0] && responseData.choices[0].message) {
return responseData.choices[0].message.content.trim();
} else {
log(“Unexpected response format from OpenAI: ” + JSON.stringify(responseData));
return “Sorry, I couldn’t process the request.”;
}
} catch (error) {
log(“Error calling OpenAI API: ” + error);
return “Sorry, there was an error processing your request.”;
}
}
function aiAnalyze() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const url = sheet.getRange(‘B2’).getValue();
const keywords = sheet.getRange(‘A3:A12’).getValues().flat().filter(Boolean); // Get non-empty keywords
const inspectionData = sheet.getRange(‘A16:B20’).getValues();
// Validate input fields
if (!url || keywords.length === 0 || inspectionData.some(row => row.length < 2 || !row[0].trim() || !row[1].trim())) {
SpreadsheetApp.getUi().alert(“Ensure the following are filled before running AI Analyze:\n- URL in B2\n- Keywords in A3:A12\n- Inspection data in A16:B20”);
return;
}
// Prepare the prompt for ChatGPT
const prompt = `
Analyze this URL: ${url}
Also the view-source version from: ${url}
against these keywords: ${keywords.join(“, “)}
Considering the URL inspection data from Google Search Console:
${inspectionData.map(row => `${row[0]}: ${row[1]}`).join(“\n”)}
Suggest a short list of specific recommendations on how I can improve the page’s SEO. Make sure the recommendations include details such as change this to that, or add something, etc… Be concrete with SEO recommendations.
`;
// Display the prompt in G1
sheet.getRange(‘G1’).setValue(“Prompt Sent to ChatGPT”).setFontWeight(“bold”);
sheet.getRange(‘G2:G30’).clearContent(); // Clear previous content in column G
sheet.getRange(‘G2:G30’).merge(); // Merge cells G2:G30
sheet.getRange(‘G2’).setValue(prompt).setVerticalAlignment(“top”); // Add the prompt and align to top
sheet.setColumnWidth(7, 400); // Set column G width to 400px
// Call ChatGPT API
const analysisResult = callChatGPT(prompt);
// Display the result in the spreadsheet (Column F)
sheet.getRange(‘F1’).setValue(“AI Analysis Result”).setFontWeight(“bold”);
sheet.getRange(‘F2:F30’).clearContent(); // Clear previous content
sheet.getRange(‘F2:F30’).merge(); // Merge the cells
sheet.getRange(‘F2’).setValue(analysisResult).setVerticalAlignment(“top”); // Add the AI result and align to top
sheet.setColumnWidth(6, 400); // Set column F width to 400px
// Log the response
log(“AI Analysis Completed: ” + analysisResult);
}
بازگشت به شیت و استفاده از گزینه جدید:
حالا که مراحل اولیه رو انجام دادید، به شیت خودتون برگردید، رفرش کنید و از گزینه Search Console > Fetch GSC Properties استفاده کنید. تمام مراحل رو دنبال کنید تا زمانی که از شما خواسته بشه که حساب کاربری خودتون رو انتخاب کنید و در نهایت آیتم مورد نظر رو انتخاب کنید. اگه همه چیز درست پیش بره، حالا میتونید وارد مرحله هیجان انگیز اتوماسیون تحلیل سئو بشید و اولین تحلیل سئو رو با اسکریپت جدید اجرا کنید.
ترکیب Google Sheets، GSC و ChatGPT:
تا اینجا کارهای زیادی انجام دادید، ولی وقتشه که ببینید این ابزارها چطور در عمل کار میکنند.
روند کار به این صورت خواهد بود:
به قسمت Search Console > Authorize GSC برید. مطمئن بشید که با حساب کاربریای وارد شدید که دامنهی گوگل سرچ کنسول شما به اون وصل شده؛ وگرنه کار نمیکنه.
حالا به Search Console > Fetch GSC Properties برید. در این مرحله، سلول B1 شیت شما پر شده و از شما خواسته میشه که دامنهای که میخواهید تحلیل کنید رو انتخاب کنید و URL مربوط به اون دامنه رو هم از B1 انتخاب کنید.
بعد به Search Console > Inspect URL برید. نتایج بررسی URL در شیت نمایش داده میشه و اطلاعات مهمی مثل وضعیت پوشش، تاریخ آخرین crawl و خیلی چیزهای دیگه به شما نشون داده میشه.
و در نهایت، یک مرحله دیگه مونده که باید انجام بدید:
به Search Console > AI Analyze برید. حالا اطلاعات در قسمت “نتایج تحلیل AI” به شما نشون داده میشه که شامل تحلیلهای مهم درباره صفحه هست و به شما میگه که چطور میتونید اون صفحه رو بهبود بدید.
مهمه که دستورالعملها رو کورکورانه دنبال نکنید، اما این مراحل میتونند به شما کمک کنند که گامهای مفیدی برای بهتر کردن صفحه بردارید.
اگه میخواهید پرامپت ChatGPT رو تغییر بدید و دادههای خودتون رو اضافه کنید، به سلول G2 برید که دقیقا زیر عنوان “پرامپت ارسال شده به ChatGPT” قرار داره.
تبریک میگم! حالا شما یک اسکریپت دارید که میتونه تحلیل سئو رو سریعتر و کارآمدتر کنه و خستگیتون رو دربیاره. ترکیب گوگل شیت، گوگل سرچ کنسول و ChatGPT به من کمک کرده به جای اینکه ساعتها مشغول تحلیل صفحات مختلف بشم، کارهای سئو رو سریعتر انجام بدم و وقت بیشتری برای بهینه سازی صفحات بذارم. حالا میتونید این اسکریپت رو امتحان کنید و روشهای جدیدی پیدا کنید که مناسب کار شما باشه.
در وینت سئو، با ارائه خدمات سئو و بکارگیری استراتژیهای هوشمندانه، سایت شما را به اوج میبریم تا در دنیای دیجیتال بدرخشید و جایگاهی ماندگار در نتایج جستجو پیدا کنید.