const BATCH_SIZE = 100; // 一度に処理する件数(変更可能)
function fetchAllYahooCountsInBatches() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
const keywords = sheet.getRange(1, 1, lastRow).getValues();
const allintitleResults = sheet.getRange(1, 3, lastRow).getValues(); // C列
const intitleResults = sheet.getRange(1, 4, lastRow).getValues(); // D列
let processedCount = 0;
for (let i = 0; i < lastRow; i++) {
const keyword = keywords[i][0];
const allCell = allintitleResults[i][0];
const intCell = intitleResults[i][0];
// すでに処理済みならスキップ(C列とD列が両方空のときのみ処理)
if (!keyword || (allCell && intCell)) continue;
try {
// allintitle 検索 → C列(3)
const allQuery = encodeURIComponent("allintitle:" + keyword);
const allUrl = `https://search.yahoo.co.jp/search?p=${allQuery}`;
const allHtml = UrlFetchApp.fetch(allUrl, { muteHttpExceptions: true }).getContentText();
const allMatch = allHtml.match(/約([\d,]+)件/);
const allResult = allMatch ? allMatch[1].replace(/,/g, '') : 0;
sheet.getRange(i + 1, 3).setValue(allResult); // C列
// note.com の存在チェック → E列(5)
const noteValue = allHtml.includes("note.com") ? "note:〇" : "";
sheet.getRange(i + 1, 5).setValue(noteValue); // E列
// chiebukuro.yahoo.co.jp の存在チェック → F列(6)
const chiebukuroValue = allHtml.includes("chiebukuro.yahoo.co.jp") ? "知恵袋:〇" : "";
sheet.getRange(i + 1, 6).setValue(chiebukuroValue); // F列
Utilities.sleep(1000);
// intitle 検索 → D列(4)
const intQuery = encodeURIComponent("intitle:" + keyword);
const intUrl = `https://search.yahoo.co.jp/search?p=${intQuery}`;
const intHtml = UrlFetchApp.fetch(intUrl, { muteHttpExceptions: true }).getContentText();
const intMatch = intHtml.match(/約([\d,]+)件/);
const intResult = intMatch ? intMatch[1].replace(/,/g, '') : 0;
sheet.getRange(i + 1, 4).setValue(intResult); // D列
Utilities.sleep(1000);
} catch (e) {
Logger.log(`Error at row ${i + 1}: ${e.message}`);
sheet.getRange(i + 1, 3).setValue("Error");
sheet.getRange(i + 1, 4).setValue("Error");
sheet.getRange(i + 1, 5).setValue("Error");
sheet.getRange(i + 1, 6).setValue("Error");
}
processedCount++;
if (processedCount >= BATCH_SIZE) break; // バッチ制限に達したら終了
}
Logger.log(`✅ 処理済み件数: ${processedCount}`);
}
キーワードを入力値として受け取り、記事タイトルを30文字以上、35文字以下で出力してください。(例:アシックスのスニーカーおすすめ7選。歩きやすい快適な一足はこれ!)
作成したタイトルでSEO記事を書くために必要な情報を、以下の点を意識してWeb検索してまとめてください。
ターゲット読者の検索意図を考慮して、どのような疑問や悩みが解決されるべきかを中心に情報を収集してください。
記事内でおすすめできる商品についての情報を収集してください。
競合他社が提供している内容や、よく使われている見出しをチェックし、他の記事と差別化できる内容を特定してください。
収集する情報は、信頼性の高い情報源(公式サイト、業界リーダーの記事、調査データなど)を優先し、古い情報や信頼性が低い情報は避けてください。
必要に応じて、検索結果に出てきたユーザーのレビューやQ&Aサイトの意見も参考にしてください。
記事の構成や見出しは出力しないでください。
記事生成依頼
目的
前のタスクで作成したタイトル案と収集した情報をもとに、google検索で上位表示されるのに適した構成で記事全文を1回のみ作成し、他には何も出力しないでください。
1.全体要件
法令・ガイドライン順守
ymyl領域に抵触しないようにする
景品表示法や薬機法、特定商取引法など、関連法令・業界ガイドラインに抵触しない表現で執筆する。
文章中に商品名・作品名(例:iphone)が登場する場合はすべてiphoneの形式で記述する
2.トーン&スタイル
読者と会話しているような自然な口語調。
文体にリズムや緩急をつけ、冗長にならないよう適度に文を切る。
表は使用しない(リスト・段落で整理する)。
3.構成
H2を中心とした階層構造で、見出しだけでも内容が追えるようにする。
キーワードを本文最初と最後の見出しに自然に含める。
4.SEO 方針
指定キーワードを中心に共起語・関連語も自然に散りばめ、文脈を壊さない範囲で適切な頻度で配置する。
キーワードを記事冒頭と末尾の見出しには必ず完全一致で含める。
禁止事項
このプロンプト文言(例:「SEOを意識」「noteで読みやすい内容」等)を記事本文に絶対に書かない。
web検索を使用しない