part1 【スプレッドシート】列の最終行へ一発ジャンプする
ハイパーリンクを動的に作成する便利な方法
#スプレッドシート
https://www.youtube.com/shorts/tkJ7hDE_9tc
part1 【スプレッドシート】列の最終行へ一発ジャンプする
ハイパーリンクを動的に作成する便利な方法
#スプレッドシート
https://www.youtube.com/shorts/tkJ7hDE_9tc
次世代AI検索エンジン「Genspark(ジェンスパーク)」の特徴や使い方を解説。従来の検索との違いや、AIが独自のページを自動生成する「Sparkpage」の魅力とは?効率的な情報収集を目指す方は必見の内容です。

Gensparkは、複数のAIモデルを統合して高度な検索体験を提供する「AIエージェント型」検索エンジンです。
従来の検索エンジンのようにリンクを並べるのではなく、ユーザーの問いに対して直接的な回答を生成します。
Just a moment...
www.genspark.ai
従来型検索は、ユーザーが複数のサイトを巡回して情報を精査する必要がありました。一方、GensparkはAIが情報を要約し、信頼性の高いソースを引用しながら一つの回答にまとめ上げます。
これにより、リサーチ時間を削減することが可能です。
Gensparkの最大の特徴は、検索結果として独自のWebページを瞬時に作成する「Sparkpage」機能にあります。

キーワードを入力するだけで、AIがインターネット上の情報を収集・分析し、構造化された専用ページを生成します。
現在、この機能は情報の網羅性が高く、Wikiペディアのパーソナライズ版のような利便性を提供しています。
ビジネスや学習において、Gensparkを導入することで得られるメリットは多岐にわたります。
複数のタブを開いて比較検討する手間がなくなります。例えば「2025年の最新ノートPC比較」と検索すれば、スペック比較表や価格帯、ユーザーレビューの傾向を一瞬で把握できます。
| 機能 | 従来型検索 | Genspark |
| 結果の形式 | リンクのリスト | AIによる要約・独自ページ |
| 情報収集時間 | 長い(サイト巡回が必要) | 短い(1画面で完結) |
| 広告の有無 | 多い | 少ない(情報の純度が高い) |
Gensparkは直感的なインターフェースを採用しており、誰でもすぐに使いこなせます。
検索窓に知りたい内容を入力するだけですが、より詳細な回答を得るには「比較して」「〜の背景を教えて」といった具体的な指示が有効です。
また、生成されたSparkpageはカスタマイズ可能で、必要なセクションを追加・削除して自分だけの資料に仕上げられます。
AI検索市場は急速に進化しており、Gensparkはその最前線に位置しています。
AIの課題であった「ハルシネーション(嘘の回答)」を抑制する技術が向上しています。
Gensparkはリアルタイムのウェブインデックスを参照するため、ニュースや株価、最新技術などの鮮度が求められる情報にも強いのが特徴です。
Gensparkは、単なる検索ツールを超えた「パーソナル・リサーチ・アシスタント」といえる存在です。
日常生活や仕事、恋愛や挑戦――私たちはうまくいかなかったとき、「どうせ大したことない」と自分を納得させた経験はありませんか?今回は、そんな心理を見事に描いたイソップ寓話「すっぱい葡萄」をご紹介します。
ある暑い日、森を歩いていたキツネが、高い棚にたわわに実った葡萄を見つけました。
「おいしそうだな…!」と手を伸ばし、必死にジャンプします。
何度も頑張りますが、どうしても葡萄には届きません。

疲れ果てたキツネは、そっとつぶやきます。
「どうせ、あの葡萄はすっぱいに違いない…」
そして、何も得られぬままその場を立ち去りました。
キツネの行動――欲しかったものが手に入らなかったショックをごまかすため、「本当は欲しくなかった」と自己正当化する姿が印象的です。
これは「負け惜しみ」や「合理化」と呼ばれる心理で、失敗や挫折、叶わぬ願いに直面したとき、誰もが心の内で使う防衛メカニズムです。
「すっぱい葡萄」は、人間なら誰もが持つ“傷つきやすさ”や“自尊心”を優しく描いた物語です。
大人になっても、「手に入らなかったものを悪く言う」ことで自分を守ろうとする気持ちを持つことがあります。
でも実は、悔しさや失敗をそのまま受け止めるほうが、次の一歩や成長につながることも多いのです。
「すっぱい葡萄」は、日常のふとした“負け惜しみ”や“言い訳”に気づくきっかけになります。
うまくいかなかったとき、「どうせあれはすっぱい」とごまかさず、「今回は届かなかった」と素直に認めてみましょう。
その正直さが、次のチャレンジへの勇気や成長を生みます。
中洲屋台など、地域の屋台情報を地図上でまとめて見たい。そんな思いから、Googleスプレッドシートをデータベースとして、Leafletで表示する屋台マップを作ってみます。この記事では、無料の構成で実現する方法をまとめます。
Google Spreadsheet
↓ (getYataiList)
Google Apps Script (Web App)
↓
Leaflet + OpenStreetMap (index.html)
シート名:屋台リスト(例)
| 屋台ID | 名称 | 緯度経度 | カテゴリー | 利用可能曜日 |
|---|---|---|---|---|
| 1 | 博多屋台ラーメン一番 | 33.5903,130.4018 | ラーメン | 月〜土 |
| 2 | 焼き鳥だるま | 33.5899,130.4024 | 焼き鳥 | 水〜日 |
| 3 | 餃子ひかり | 33.5905,130.4007 | 餃子 | 金・土 |
緯度経度は「カンマ区切り」で入力(例:33.5903,130.4018)。Googleマップなどで座標を取得できます。
スプレッドシートから屋台データを取得して返すAPIを作ります。
/**
* 屋台マップ用 Webアプリ
*/
function doGet(e) {
return HtmlService.createHtmlOutputFromFile("index")
.setTitle("屋台マップ")
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
/**
* スプレッドシートから屋台データを取得
*/
function getYataiList() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("屋台リスト");
const data = sheet.getDataRange().getValues();
const headers = data[0];
const idIndex = headers.indexOf("屋台ID");
const nameIndex = headers.indexOf("名称");
const latlonIndex = headers.indexOf("緯度経度");
const categoryIndex = headers.indexOf("カテゴリー");
const daysIndex = headers.indexOf("利用可能曜日");
const result = [];
for (let i = 1; i < data.length; i++) {
const row = data[i];
const latlon = row[latlonIndex];
if (!latlon || !String(latlon).includes(",")) continue;
const [lat, lon] = latlon.split(",").map((x) => parseFloat(x.trim()));
if (isNaN(lat) || isNaN(lon)) continue;
result.push({
id: row[idIndex] || "",
name: row[nameIndex] || "名称未設定",
category: row[categoryIndex] || "",
days: row[daysIndex] || "",
lat,
lon,
});
}
return result;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>屋台マップ</title>
<!-- Leaflet -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
html, body { height: 100%; margin: 0; padding: 0; }
body {
font-family: "Noto Sans JP", sans-serif;
display: flex;
flex-direction: column;
background-color: #fafafa;
}
header {
background: #c62828;
color: #fff;
text-align: center;
padding: 8px 0;
font-size: 18px;
letter-spacing: 0.05em;
}
#map { flex-grow: 1; width: 100%; height: 100%; }
.popup-name { font-weight: bold; font-size: 15px; color: #b71c1c; }
.popup-category { font-size: 13px; color: #444; }
.popup-days { font-size: 12px; color: #1b5e20; margin-top: 2px; }
</style>
</head>
<body>
<header>屋台マップ</header>
<div id="map"></div>
<script>
// 初期位置(福岡・中洲付近)
const map = L.map("map").setView([33.5898, 130.4021], 16);
// OpenStreetMap タイル
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "地図データ © OpenStreetMap contributors",
}).addTo(map);
// 屋台アイコン
const yataiIcon = L.icon({
iconUrl: "https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.png",
shadowUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png",
iconSize: [25, 41],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
shadowSize: [41, 41],
});
// GASから屋台データ取得
google.script.run.withSuccessHandler(displayYatai).getYataiList();
// ピンを描画
function displayYatai(list) {
list.forEach((y) => {
if (isNaN(y.lat) || isNaN(y.lon)) return;
const popupHtml = `
<div class="popup-content">
<div class="popup-name">${y.name}</div>
<div class="popup-category">カテゴリー:${y.category}</div>
<div class="popup-days">営業日:${y.days}</div>
</div>
`;
L.marker([y.lat, y.lon], { icon: yataiIcon })
.addTo(map)
.bindPopup(popupHtml);
});
}
</script>
</body>
</html>
Code.gs と index.html を追加
スプレッドシートとGoogle Apps Script(GAS)で、予約の残り枠が表示されるウェブアプリを作成します。
目次
スプレッドシートで予約枠を管理(Googleフォームを使った場合と同じようなイメージ)
GASでウェブアプリを作成
HTMLファイルで予約フォームの見た目を作成
GASのサーバー側スクリプトで、残り枠のデータ処理と予約の受付処理を行う
ウェブアプリとして公開
予約枠を管理するためのスプレッドシートを用意します。
シート1 (予約管理):
A列: 予約項目名(例:9月29日 10:00-11:00)
B列: 定員数(例:5)
C列: 予約済み(GASが自動で更新)
D列: 残り枠(GASが自動で計算)
シート2 (予約履歴): 予約受付後に、回答内容を保存するシート。
スプレッドシートからApps Scriptエディタを開き、ウェブアプリを作成します。
予約フォームの見た目を定義します。選択肢はJavaScriptで動的に生成します。
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
/* CSSでフォームのスタイルを調整 */
</style>
</head>
<body>
<h1>予約フォーム</h1>
<form id="bookingForm">
<label for="name">お名前:</label><br>
<input type="text" id="name" name="name" required><br><br>
<label for="email">メールアドレス:</label><br>
<input type="email" id="email" name="email" required><br><br>
<label for="slot">ご希望の予約枠:</label><br>
<select id="slot" name="slot" required>
<!-- 予約枠の選択肢はGASから取得してここに表示 -->
</select><br><br>
<button type="submit">予約する</button>
</form>
<div id="result"></div>
<script>
// 予約枠の情報を取得して、プルダウンに表示
document.addEventListener("DOMContentLoaded", function() {
google.script.run.withSuccessHandler(showBookingSlots).getBookingSlots();
});
function showBookingSlots(slots) {
const selectElement = document.getElementById("slot");
selectElement.innerHTML = ''; // 既存の選択肢をクリア
if (slots.length === 0) {
const option = document.createElement("option");
option.text = "満席のため、現在予約できません。";
selectElement.add(option);
selectElement.disabled = true;
} else {
slots.forEach(slot => {
const option = document.createElement("option");
option.value = slot[0]; // 予約項目名
option.text = `${slot[0]} (残り${slot[1]}席)`; // 項目名と残り枠を表示
selectElement.add(option);
});
}
}
// フォーム送信時の処理
document.getElementById("bookingForm").addEventListener("submit", function(e) {
e.preventDefault(); // ページの再読み込みを防止
const name = document.getElementById("name").value;
const email = document.getElementById("email").value;
const slot = document.getElementById("slot").value;
google.script.run.withSuccessHandler(showResult).submitBooking(name, email, slot);
});
function showResult(result) {
const resultDiv = document.getElementById("result");
resultDiv.textContent = result;
// 成功したらフォームをリセット
if (result.includes("予約が完了しました")) {
document.getElementById("bookingForm").reset();
google.script.run.withSuccessHandler(showBookingSlots).getBookingSlots(); // 再度残り枠を更新
}
}
</script>
</body>
</html>
コードは注意してご使用ください。
HTMLとスプレッドシートを連携させるための処理を記述します。
const SPREADSHEET_ID = 'スプレッドシートIDを設定';
const BOOKING_SHEET_NAME = '予約管理';
const LOG_SHEET_NAME = '予約履歴';
function doGet() {
return HtmlService.createHtmlOutputFromFile('index.html');
}
function getBookingSlots() {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const bookingSheet = ss.getSheetByName(BOOKING_SHEET_NAME);
const lastRow = bookingSheet.getLastRow();
const bookingData = bookingSheet.getRange(2, 1, lastRow - 1, 4).getValues();
const availableSlots = bookingData.filter(row => row[3] > 0).map(row => [row[0], row[3]]);
return availableSlots;
}
function submitBooking(name, email, slot) {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const bookingSheet = ss.getSheetByName(BOOKING_SHEET_NAME);
const logSheet = ss.getSheetByName(LOG_SHEET_NAME);
const lastRow = bookingSheet.getLastRow();
const bookingData = bookingSheet.getRange(2, 1, lastRow - 1, 3).getValues();
// A:予約項目名 B:定員 C:予約済み
let bookedSuccessfully = false;
for (let i = 0; i < bookingData.length; i++) {
let [slotName, capacity, booked] = bookingData[i];
let remaining = capacity - booked;
if (slotName === slot && remaining > 0) {
// 予約済みを+1
bookingSheet.getRange(i + 2, 3).setValue(booked + 1);
// 履歴シートに追加
logSheet.appendRow([new Date(), name, email, slot]);
bookedSuccessfully = true;
break; // 見つかったら終了!
}
}
if (bookedSuccessfully) {
return `予約が完了しました。\n予約枠: ${slot}`;
} else {
return '申し訳ありませんが、その予約枠はすでに埋まってしまいました。';
}
}
コードは注意してご使用ください。
Apps Scriptエディタで「デプロイ」→「新しいデプロイ」をクリックします。
種類の選択で「ウェブアプリ」を選びます。
アクセスできるユーザーを「全員」に設定します。
「デプロイ」をクリックします。
URLが発行されるので、そのURLにアクセスすれば予約フォームが表示されます。
マーケティングやSNS運用、商品企画などでよく聞く「ペルソナ」。
これは単なる“理想のお客様像”ではなく、行動や価値観まで具体的に描くことで「誰に届けるか」がはっきりし、発信や施策の精度がぐっと上がります。
しかし「どう作ればいいのかわからない…」という方も多いはず。
そこで今回は、ペルソナ作成を練習するためのフォーマットをご紹介します。
下記の項目を埋めるだけで、1人の人物像が浮かび上がります。
ペルソナ作成フォーマット
例:カフェの新メニューを広めたい場合
ペルソナ例
このようにまとめると、
「彩子さんが魅力を感じるSNS投稿は何か?」を考えやすくなります。
「100匹目の猿現象」とは、ある島の猿が新しい行動を学び、それが一定数に達すると、離れた場所の猿たちにも自然に広がったとされる現象です。
これは単なる噂や都市伝説ではなく、「集合意識」「臨界数」「人類の進化」などを考えるうえで重要なヒントを与えてくれるテーマとして、多くの研究者やスピリチュアル分野で取り上げられています。
パーマリンクとはWebページごとに固定されたURLのことです。この記事では、パーマリンクの基本的な意味、仕組み、そしてWordPressでの設定方法をわかりやすく解説します。
パーマリンク(permalink)とは、「Permanent Link(パーマネントリンク)」の略で、ウェブページごとに設定される恒久的なURLのことを指します。
たとえば、以下のようなURLがパーマリンクです。
https://example.com/about/
これは「about」ページを指す固定のURLであり、記事の内容を更新してもこのリンク自体は基本的に変わりません。
一度シェアされたリンクが後に変更されると、アクセスできなくなってしまいます。そうした問題を避けるために、パーマリンクは「変わらないURL」として設計されます。
パーマリンクはWebサイト運営やコンテンツ管理において、次のような重要な役割を担っています。
ユーザーがブックマークや共有をしやすくなる
コンテンツの所在を一意に示す
検索エンジンがページ内容を識別しやすくなる
外部リンクやSNSで拡散されたURLが有効に保たれる
たとえばブログ記事や商品ページなどは、それぞれに固有のパーマリンクを持つことで、検索エンジンやユーザーに正確に内容を伝えることができます。
パーマリンクは以下のような構成でできています。
https://example.com/category-name/post-name/
この場合、
https://example.com/ → ドメイン名
category-name/ → カテゴリースラッグ(省略可能)
post-name/ → 投稿スラッグ(各記事に固有)
投稿スラッグ(末尾の部分)は、各投稿ごとに設定され、英数字とハイフンで構成されるのが一般的です。
WordPressでは、投稿や固定ページのURLを簡単にカスタマイズできます。ここではパーマリンクの設定手順を紹介します。
WordPress管理画面にログイン
左メニューから「設定」→「パーマリンク」をクリック
表示された選択肢の中から、適切な構造を選択(投稿名、日付と投稿名など)
最下部の「変更を保存」をクリック
この設定は、サイト全体のパーマリンク構造を一括で適用します。
投稿の編集画面を開く
右サイドバーの「パーマリンク」または「URLスラッグ」を確認
任意の文字列に変更(半角英数字とハイフンが推奨)
投稿を保存または公開
たとえば、「パーマリンクとは」という記事なら permalink や permalink-guide などと設定できます。
サイト公開後にパーマリンクを変更すると、次のような影響があります。
旧URLが無効になり、リンク切れが発生
検索エンジンに再インデックスされるまでに時間がかかる
外部リンクやSNSの評価が無効化される可能性がある
そのため、パーマリンクの設計は初期段階で慎重に決めておくことが重要です。やむを得ず変更する場合は、リダイレクト(301リダイレクト)設定を行い、旧URLから新URLへ自動転送する処理が必要になります。
パーマリンクとは、Webページごとに割り当てられる固定のURLであり、サイト構造やSEOにも深く関係する重要な要素です。特にWordPressを使っている場合、最初にパーマリンクの構造を整えておくことで、後々のトラブルを防ぎ、検索エンジンからの評価も高めやすくなります。
パーマリンク設定には必ず気を配りましょう。
UDP(User Datagram Protocol)は、インターネットで使われる通信プロトコルの一つで、TCP/IPプロトコル群に属します。
TCPとは異なり、接続の確立や確認応答を行わない「非接続型」の通信方式であることが最大の特徴です。
UDPはヘッダ情報が最小限(8バイト)であるため処理が軽く、データの送受信が高速で行えます。
確認応答や再送処理がないため、遅延が少なくリアルタイム性が求められるアプリケーションに適しています。
パケットの欠落や順序の入れ替わり、重複の可能性があるため、信頼性を求める通信には不向きです。
| 項目 | TCP | UDP |
|---|---|---|
| 接続方式 | コネクション型(接続を確立) | 非コネクション型(接続不要) |
| 信頼性 | 高い(再送・順序制御あり) | 低い(再送・順序制御なし) |
| 転送速度 | やや遅い | 高速 |
| 用途 | Web通信、メールなど | 動画配信、音声通話、オンラインゲームなど |
UDPは信頼性が低いため、アプリケーション側でエラーチェックや再送処理を実装する必要があります。また、偽装がしやすいという特性から、セキュリティ対策(ファイアウォールやアクセス制御)も重要です。
「風が吹けば桶屋が儲かる」という日本のことわざは、一見関係のない出来事が連鎖して予期せぬ結果をもたらすことを示しています。このことわざの具体的なストーリーは次のようなものです。
このように、風が吹くという初めの出来事が連鎖的に影響を及ぼし、最終的に桶屋が儲かるという予想外の結果に繋がるという教訓です。
「風が吹けば桶屋が儲かる」ということわざをマーケティングに活かす方法はいくつか考えられます。このことわざの本質は、間接的な要因が連鎖して大きな結果をもたらすという点です。これをマーケティングに応用する方法をいくつか紹介します。
顧客の行動や選択がどのように連鎖して最終的な購買に繋がるのかを分析することが重要です。
例えば、SNSでの口コミが広がることで商品への関心が高まり、それが実店舗やオンラインショップでの購買に繋がる可能性があります。
直接的な販売促進だけでなく、間接的な影響を与えるマーケティング施策を考えます。
例えば、特定のイベントやキャンペーンを開催することでブランドの認知度を高め、最終的には商品の売上増加に繋げることができます。
データ分析を用いて、どのような要因が売上や顧客満足度に影響を与えているのかを把握します。
これにより、見えにくい連鎖効果を明らかにし、戦略的なマーケティング施策を講じることができます。
顧客同士のコミュニケーションや共有がどのようにブランド価値を高めるかを考えます。
顧客の口コミやレビューが広がることで、新たな顧客獲得やリピート購入に繋がる可能性があります。
一見関係のない出来事やトレンドが、自社のビジネスにどのように影響を与えるかを考えます。
これにより、新たな市場機会や成長のチャンスを見つけることができます。