SEO自動記事分析のGASの設定
まず、GASを開きましょう。
SpreadSheetの、拡張機能 -> Apps Script を選択します。
https://scrapbox.io/files/6652044ab75d9f001d978215.png
以下の画面が開くので、この後設定にうつります。
https://scrapbox.io/files/6629e0e3d6c7ce00243a0432.png
設定の手順は以下の通りです。
①コードをコピーして貼り付け
②環境変数を設定
③ライブラリのインストール
④デプロイ
①コードをコピーして貼り付け
コードを2種類用意しました。
a: 縦向き(推奨)
https://scrapbox.io/files/6651a48c1ec3ad001de19089.png
b: 横向き
https://scrapbox.io/files/6651a3ff9b330a001c3df790.png
お好みの向きによって、コピーするコードをお選びてください。
まだ検証不足ですが、「縦向き」の方が一般的なデータ形態のため、ChatGPTに指示が通りやりやすいかも。
a: 縦向きのテーブルを希望する方(推奨)
このコードをGASに貼り付けてください。
code:javascript
const SPREADSHEET_ID =
PropertiesService.getScriptProperties().getProperty("SPREADSHEET_ID")
const CUSTOM_SEARCH_ENGINE_ID =
PropertiesService.getScriptProperties().getProperty("CUSTOM_SEARCH_ENGINE_ID")
const API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY")
// doPost関数はPOSTリクエストを受け取ります
function doPost(e) {
const params = JSON.parse(e.postData.contents)
const keyword = params.keyword
if (keyword) {
const results = searchKeyword(keyword)
saveToSpreadsheet(results)
return ContentService.createTextOutput(
JSON.stringify({
status: "success",
message: "Data saved to spreadsheet.",
}),
)
} else {
return ContentService.createTextOutput(
JSON.stringify({ status: "error", message: "Keyword is missing." }),
)
}
}
// Google Custom Search APIを使用してキーワードを検索し、結果を取得します
function searchKeyword(keyword) {
keyword,
)}&cx=${CUSTOM_SEARCH_ENGINE_ID}&key=${API_KEY}`
const response = UrlFetchApp.fetch(url)
const data = JSON.parse(response.getContentText())
const results = data.items.map((item) => {
const content = fetchContent(item.link)
return {
title: item.title,
link: item.link,
thumbnail: item.pagemap.cse_thumbnail
? item.pagemap.cse_thumbnail0.src : "No Image",
headings: content.headings,
}
})
return results
}
// URLから記事の内容を取得し、見出しと本文を抽出します
function fetchContent(url) {
try {
const response = UrlFetchApp.fetch(url)
const html = response.getContentText()
// HTMLの解析にはCheerioライブラリを使用
const $ = Cheerio.load(html)
// 見出しを抽出(h1とh4は無視、h2とh3を抽出)
let h2Count = 0
const headings = []
$("h1, h2, h3, h4").each((index, element) => {
if (element.tagName === "h2") {
h2Count++
headings.push(h2Count + ". " + $(element).text())
} else if (element.tagName === "h3") {
headings.push("- " + $(element).text())
}
})
return {
headings: headings.join("\n"),
}
} catch (e) {
return {
headings: "Content fetch error",
}
}
}
// 取得した結果をスプレッドシートに保存します
function saveToSpreadsheet(results) {
const sheet =
SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName("シート1")
// 見出しを設定
const headers = [
"No",
"タイトル",
"サムネイル画像",
"見出し",
"タイトルurl",
"サムネイル画像url",
]
const headerRange = sheet.getRange(1, 1, 1, headers.length)
headerRange.setBackground("#d9d9d9") // 色を設定
results.forEach((result, index) => {
const row = index + 2 // データは2行目から開始
const titleCell = sheet.getRange(row, 2)
const thumbnailCell = sheet.getRange(row, 3)
const headingsCell = sheet.getRange(row, 4)
const titleUrlCell = sheet.getRange(row, 5)
const thumbnailUrlCell = sheet.getRange(row, 6)
// No列に番号を設定
sheet.getRange(row, 1).setValue(index + 1)
// タイトルにハイパーリンクを設定
titleCell.setFormula(=HYPERLINK("${result.link}", "${result.title}"))
// サムネイル画像を表示
if (result.thumbnail !== "No Image") {
thumbnailCell.setFormula(=IMAGE("${result.thumbnail}", 4, 50, 100))
}
// 見出しを設定
headingsCell.setValue(result.headings)
// タイトルurlとサムネイル画像urlを設定
titleUrlCell.setValue(result.link)
thumbnailUrlCell.setValue(result.thumbnail)
})
}
b: 横向きのテーブルを希望する方
このコードをGASに貼り付けてください。
code: javascript
const SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty("SPREADSHEET_ID");
const CUSTOM_SEARCH_ENGINE_ID = PropertiesService.getScriptProperties().getProperty("CUSTOM_SEARCH_ENGINE_ID");
const API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY");
// doPost関数はPOSTリクエストを受け取ります
function doPost(e) {
const params = JSON.parse(e.postData.contents)
const keyword = params.keyword
if (keyword) {
const results = searchKeyword(keyword)
saveToSpreadsheet(results)
return ContentService.createTextOutput(
JSON.stringify({
status: "success",
message: "Data saved to spreadsheet.",
}),
)
} else {
return ContentService.createTextOutput(
JSON.stringify({ status: "error", message: "Keyword is missing." }),
)
}
}
// Google Custom Search APIを使用してキーワードを検索し、結果を取得します
function searchKeyword(keyword) {
keyword,
)}&cx=${CUSTOM_SEARCH_ENGINE_ID}&key=${API_KEY}`
const response = UrlFetchApp.fetch(url)
const data = JSON.parse(response.getContentText())
const results = data.items.map((item) => {
const content = fetchContent(item.link)
return {
title: item.title,
link: item.link,
thumbnail: item.pagemap.cse_thumbnail
? item.pagemap.cse_thumbnail0.src : "No Image",
headings: content.headings,
}
})
return results
}
// URLから記事の内容を取得し、見出しと本文を抽出します
function fetchContent(url) {
try {
const response = UrlFetchApp.fetch(url)
const html = response.getContentText()
// HTMLの解析にはCheerioライブラリを使用
const $ = Cheerio.load(html)
// 見出しを抽出(h1とh4は無視、h2とh3を抽出)
let h2Count = 0
const headings = []
$("h1, h2, h3, h4").each((index, element) => {
if (element.tagName === "h2") {
h2Count++
headings.push(h2Count + ". " + $(element).text())
} else if (element.tagName === "h3") {
headings.push("- " + $(element).text())
}
})
return {
headings: headings.join("\n"),
}
} catch (e) {
return {
headings: "Content fetch error",
}
}
}
// 取得した結果をスプレッドシートに保存します
function saveToSpreadsheet(results) {
const sheet =
SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName("シート1")
// 見出しを設定
const headerRange = sheet.getRange(1, 1, headers.length, 1)
headerRange.setValues(headers.map(header => header)) headerRange.setBackground("#d9d9d9") // 色を設定
results.forEach((result, index) => {
const column = index + 2 // データを2列目から開始
// No列に番号を設定
sheet.getRange(1, column).setValue(index + 1)
// タイトルにハイパーリンクを設定
sheet.getRange(2, column).setFormula(=HYPERLINK("${result.link}", "${result.title}"))
// サムネイル画像を表示
if (result.thumbnail !== "No Image") {
sheet.getRange(3, column).setFormula(=IMAGE("${result.thumbnail}", 4, 50, 100))
}
// 見出しを設定
sheet.getRange(4, column).setValue(result.headings)
// タイトルurlとサムネイル画像urlを設定
sheet.getRange(5, column).setValue(result.link)
sheet.getRange(6, column).setValue(result.thumbnail)
})
}
②環境変数を設定
サイドバーのプロジェクトの設定をクリック
https://scrapbox.io/files/665206a0cffcb5001db4af4b.png
スクロールするとスクリプトプロパティの項目が表示されるので、「スクリプトプロパティを追加」を選択。
左のプロパティに以下を設定し、右側に今まで取得して控えてきた値をそれぞれ入力してください。
API_KEY
CUSTOM_SEARCH_ENGINE_ID
SPREADSHEET_ID
https://scrapbox.io/files/665206cdeb6914001cf5e554.png
終わったら、左のサイドバーのエディタに戻ります。
https://scrapbox.io/files/665208b9bd7cfc001ce36054.png
③ライブラリのインストール
Cheeriogsというライブラリを使って、urlの記事の見出しを取得します。
下の値をコピーして、
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
左のサイドバーの、ライブラリ -> スクリプトID に貼り付け、追加してください。
https://scrapbox.io/files/665208d3514315001df8f04e.png
④デプロイ
全て完了したら、右上のデプロイ -> 新しいデプロイを押します。
https://scrapbox.io/files/66520a035e171b001dad8c7b.png
歯車 -> ウェブアプリ -> 全員 -> デプロイをしてください。
https://scrapbox.io/files/66520bcf1d5023001d6a46a1.png
デプロイしたら、デプロイIDを控えてください。
https://scrapbox.io/files/66520fc9e45517001d8623ee.png
補足: GASのコードを変えたい時
code:js
keyword,
)}&cx=${CUSTOM_SEARCH_ENGINE_ID}&key=${API_KEY}`
いくつか例を上げる。
検索結果を変更したい(例えば、5件にしたい)
&num=数字 をurlに追加してあげます。
&num=5 &num=15 など
code: javascript
keyword,
)}&cx=${CUSTOM_SEARCH_ENGINE_ID}&key=${API_KEY}&num=5`
英語など特定の言語の結果のみを取得したい
code: javascript
keyword,
)}&cx=${CUSTOM_SEARCH_ENGINE_ID}&key=${API_KEY}&lr=lang_en`
変更したら、デプロイを管理を選択
https://scrapbox.io/files/6652102db75d9f001d97c0b8.png
編集ボタンを押し
https://scrapbox.io/files/66521059bd7cfc001ce3a40b.png
下三角をクリック
https://scrapbox.io/files/66521084019337001d2cbcf7.png
新バージョン -> デプロイを実行してください。