2026年1月18日日曜日

AI時代の中小企業診断/全体戦略/経営改善提案を検証するアンケート作成(GoogleFormsへの登録)

 AI時代のセカンドライフ: AI時代の中小企業診断/全体戦略/経営改善提案を検証するアンケート作成

にて作成したアンケートをgeminiの補助を受けてGoogleFormsでのアンケートに仕上ました。


※URL短縮も可能です。

アンケート結果も即時グラフ化されます。

【作業手順】

1.スプレッドシート化

AI時代のセカンドライフ: AI時代の中小企業診断/全体戦略/経営改善提案を検証するアンケート作成 について、geminiにGoogleFormsへ登録可能なスプレッドシート形式に変換これをコピーしたファイルをGoogleスプレッドシートに作成

質問 (A列)形式 (B列)選択肢1 (C列)選択肢2 (D列)選択肢3 (E列)選択肢4 (F列)選択肢5 (G列)
性別Multiple Choice男性女性回答しない
年齢層Multiple Choice10代20代30代40代50代以上
来店頻度Multiple Choice週1回以上月2〜3回程度月1回程度数ヶ月に1回初めて
自分好みのカスタマイズ(麺の硬さ等)のしやすさLinear Scale15
(1=不満、5=非常に満足)
店舗での「活気」や「ライブ感」の満足度Linear Scale15
(1=感じない、5=非常に感じる)
公式アプリの使いやすさについてMultiple Choice非常に使いやすい普通使いにくい
アプリを利用していない
アプリや券売機の「多言語対応」の必要性Multiple Choice非常に必要あれば良い特に必要ない
「ライト家系」メニューがあった場合の利用意向Multiple Choice積極的に利用したい選択肢としてあれば嬉しい
あまり興味がない
家族や女性の友人と一緒に来店しやすくなったかMultiple Choice非常にそう思うややそう思うあまり思わない
最近のメニュー改定(価格・内容)への納得感Linear Scale15
(1=納得できない、5=十分に納得できる)
今後の利用意向Linear Scale15
(1=思わない、5=強く思う)
お店へのご意見・ご要望Paragraph

2.Google フォームへの一括作成手順
(1)アドオンのインストール:Google フォームを新規作成し、右上のパズルアイコンからアドオンを取得を選択し 「Form Builder Plus」(または類似のForm Builder系)を検索してインストール
(2)上部のアドオンアイコンから「Form Builder Plus」を選んでstartし以下実行
  ・ソースの選択:アドオンのメニューで「Google Sheets」を選択し、先ほど作成したス     
   プレッドシートを選びます。
  ・シート、形式(Q&A)、範囲A2:G13  を選択
  ・列の割り当て:
     Questions(質問)に A列 
     Question Type(形式)に B列
     Choices(選択肢)に C列〜G列 を指定します。
  ・インポート実行:「Import」ボタンを押すと、一気にフォームが完成します。
  ・公開
 
3.アンケートURLを周知

AI時代の中小企業診断/全体戦略/経営改善提案を検証するアンケート作成

 geminiに以下の経営改善提案書(仮説)を読み込ませ、消費者向けアンケートを作成しました。

AI時代のセカンドライフ: AI時代の中小企業診断/全体戦略/経営改善提案書(仮説)

プロンプト例:中小企業診断士として作成した提案 https://aisecoundlife.blogspot.com/2025/11/ai_14.htmlの効果検証のため、消費者向けアンケートを作成してください

消費者向け効果検証アンケート案

アンケートタイトル: ラーメン店(○○)のサービス向上に関するアンケート

【基本属性】

  1. 性別(ラジオボタン)

    • 男性 / 女性 / 回答しない

  2. 年齢層(ラジオボタン)

    • 10代 / 20代 / 30代 / 40代 / 50代 / 60代以上

  3. 来店頻度(ラジオボタン)

    • 週1回以上 / 月2〜3回程度 / 月1回程度 / 数ヶ月に1回 / 初めて


【戦略方針1:体験価値とカスタマイズについて】 4. 自分好みのカスタマイズ(麺の硬さ、味の濃さ等)のしやすさはいかがですか?(5段階評価)

  • 1(不満)〜 5(非常に満足)

  1. 店舗での「活気」や「ライブ感」について、どのように感じますか?(5段階評価)

    • 1(感じない)〜 5(非常に感じる)


【戦略方針2:デジタル・利便性について】 6. 公式アプリの使いやすさについて教えてください(ラジオボタン)

  • 非常に使いやすい / 普通 / 使いにくい / アプリを利用していない

  1. アプリや券売機の「多言語対応」は必要だと感じますか?(ラジオボタン)

    • 非常に必要 / あれば良い / 特に必要ない


【戦略方針3:ライト家系(新規層開拓)について】 8. 「ライト家系(減塩・小盛・キッズメニュー)」があった場合、利用したいと思いますか?(ラジオボタン)

  • 積極的に利用したい / 選択肢としてあれば嬉しい / あまり興味がない

  1. ご家族(特にお子様)や女性の友人と一緒に来店しやすくなったと感じますか?(ラジオボタン)

    • 非常にそう思う / ややそう思う / あまり思わない


【全体評価・行動変容】 10. 最近の原材料高騰に伴うメニュー改定(価格や内容)について、納得感はありますか?(5段階評価) * 1(納得できない)〜 5(十分に納得できる) 11. 今後もこのお店を利用したいと思いますか?(5段階評価) * 1(思わない)〜 5(強く思う) 12. お店へのご意見・ご要望があれば自由にご記入ください。(段落)

2026年1月17日土曜日

相場の兆し20250116

  ■ハイライト
・1/16:選挙報道で今週前半高騰、後半調整。日経vi極めて高くOPの振れ幅も大きく高ボラティリティ。外国人買い旺盛だが短期資金の可能性大。受給は買売双方にリスクあり。個人は信用倍率、インバース倍率からは踏み上げ要素無いが、1570が売り長。全体は信用売り残、裁定買い残とも積み上がり両方向にリスク。AI銘柄の影響度が低下。来週日銀政策決定会合。米企業決算や日本の政治的なヘッドラインに過剰反応する不安定な相場となるのではないか。

■指標
                               1/16
日経      53936   -174
日経先     53725 -340
Topix                 3658   -10
NYダウ       49359   +83
NASDAQ    23515   -17
SP500              6940     -4 
日経PER    20.33
vix                     15        
日経vi              30
OP上値メド   58,000円 
OP下値メド   35,000円
信用倍率    5.57
日経インバ1357信用 7.36
日経レバ信用1570  0.99
信用売り残   8624億円
(8000億円踏上げ)
裁定買い残  10億5483万
(10億株危険 清原)
海外売買    +1,224,694
騰落r(6日)   189(120警戒)
サイコロジカル 50(75加熱)
モメンタム   3409(4000加熱) 
RSI          71 (70加熱) 
移動平均乖離  5.48(5加熱)
ボリバン      1σ割れ
一目      50000円に雲

■AI銘柄寄与度【ADR】
SB                     ▲32円
アドテスト    +82円
東エレク        ▲44円 
フジクラ      +13円
FR                         ▲109円
SOX               7927 +90
2644                3014      +37

※この記事は投資を勧めるものではありません。投資は自己責任でお願いします。

路線図を活用した情報表示(例:乗降客数)

 ■Geminiなどを活用して、路線図に情報をグラフィカルにマッピングすることができます。
類似性のある駅周辺との比較などの活用が考えられます。
例えば中目黒であれば類似したAクラス駅の中から進出地域を選ぶなどの活用など考えられます

Aクラス(15万人〜30万人)駅:中目黒・日吉・武蔵小杉 乗り換え路線があり、1日を通して人が絶えない「主要拠点駅」です。特に中目黒は、乗降客数に対して周辺人口も密集しているため、非常に効率の良い商圏と言えます。





メンバ間のスケジュール調整

 ■プロジェクトメンバのスケジュール調整も以下のサイトで簡易に行えます。


調整さん - 簡単スケジュール調整、出欠管理ツール




地図情報を活用した自店舗と競合店舗位置の可視化

 ■地図情報による商圏分析

 jSTAT MAPにて商圏内の自社および競合店舗の立地を可視化できます。

青:自店舗  赤:競合

■地図で見る統計(jSTAT MAP)https://jstatmap.e-stat.go.jp/trialstart.html


■自店舗CSVのアップロード(インポート)
jSTAT MAPにログインし、画面左上のメニューから [ファイル] > [インポート] をクリックします。

**「住所マッチング」**を選択します。
[参照] ボタンから、作成したCSVファイル(例:自店舗リスト.csv、S-JIS)を選択します。

店舗名住所駅からのおよその距離
当店1目黒区上目黒3-3-1約150m
当店2目黒区東山1-4-13約500m
当店3目黒区中目黒2-10-15約400m
当店4目黒区上目黒1-2-9約300m

設定項目:
 名称: 地図に表示したい名称(「店舗名」など)を選択
 住所: 「住所」列を選択
 グループ名: 「自店舗」など分かりやすい名前を入力
 アイコン: 赤いピンなど、目立つ色を選択
 [インポート] をクリックします。

■競合店舗も同様に追加する
再度 [ファイル] > [インポート] > [住所マッチング] を開きます。
競合店舗のCSVを選択し、グループ名を「競合店舗」にします。
チェーン名店舗名住所駅からのおよその距離
AA1目黒区上目黒1-26-1約150m
AA2目黒区上目黒1-3-20約250m
AA3目黒区上目黒2-1-3約100m
AA4目黒区上目黒3-2-1約150m
AA5目黒区東山1-1-2約450m
BB1目黒区上目黒2-9-35約100m
BB2目黒区上目黒3-6-3約120m
BB3目黒区上目黒1-18-11約200m
BB4目黒区上目黒3-1-4約200m
BB5目黒区東山1-6-1約500m

アイコンを自店舗とは違う色(例:青いピンなど)に変更してインポートします。

■地図上での確認と管理
 表示の切り替え: 画面左側の「レイヤー」パネルにあるチェックボックスで、自店舗だ け、あるいは競合だけを表示・非表示にできます。

 情報の確認: 地図上のピンをクリックすると、CSVに入力した詳細情報が表示されます。

■完成した地図の必要部分を提案書に活用







2026年1月4日日曜日

相場の兆し20260104(gemini)

 ■ハイライト

日経平均は史上初の5万円台で2025年を終え、強気相場を維持。 年末にかけて「サナエノミクス」への期待とAI関連銘柄の再評価により大きく上昇したが、大納会では利益確定売りに押された。日経VIは落ち着きを見せているが、依然としてボラティリティは高い。米株市場は年始も堅調に推移しており、VIX指数は14台まで低下。需給面では裁定買い残が「危険水域」とされる10億株に迫っており、解消局面での下落リスクに警戒が必要。週明けは米株高を受けた買い先行も、高値圏での過熱感から上値は限定的か。

■指標(2026年1月4日時点)

項目数値前週比・備考
日経平均50,424.82-223 (大納会終値)
日経先物50,860大証夜間終値 (現物比プラス)
TOPIX3,418.41-8.11
NYダウ48,310+176 (年始堅調)
NASDAQ23,608+301 (AI関連買い)
S&P5006,893+59
日経PER17.82利益成長織り込み中
VIX14.51低水準(リスクオン)
日経VI23.15落ち着きつつあるが節目
OP上値メド53,000円節目5万突破で切り上げ
OP下値メド48,500円心理的節目
信用倍率4.85整理が進む
裁定買い残9億9,500万株警戒水域(10億株)直前
騰落R(6日)128120超で過熱気味
サイコロ58.3中立〜やや強気
RSI6270加熱まで余地あり
一目均衡表雲の上限で推移転換線が支持線として機能

■今後の注目点:

  1. 裁定買い残の整理: 10億株目前のため、先物主導の売りが出た際の下げ足の速さに注意。

  2. 米AI銘柄の持続性: エヌビディア等のADRが年始に続伸しており、東京市場の半導体セクターへの波及が焦点。

  3. テクニカル: 日経平均は5万円の大台を固められるか。ボリバン+1σ〜+2σの間でのバンドウォーク継続を注視。

■ ADRベース:業種別・注目銘柄の騰落状況

【上昇上位】半導体・ハイテク関連

  • 東京エレクトロン (8035) / アドバンテスト (6857)

    • 騰落状況: 米エヌビディア(NVDA)の反発を受け、対東証終値比で**+2.5%〜3.2%**の上昇。

    • 背景: 先週の調整で値ごろ感が出たところに、AI需要の再確認が入った形です。

  • ソニーグループ (6758)

    • 騰落状況: 対東証比 +1.8% 前後。

    • 背景: エンタメ部門の好調と円安進行(1ドル148円台)が追い風になっています。

【堅調】メガバンク・金融

  • 三菱UFJ (8306) / 三井住友FG (8316)

    • 騰落状況: 対東証比 +1.2%〜1.5% の上昇。

    • 背景: 米10年債利回りの上昇に連動。日本の金利先安観も後退しており、国内外の利ざや改善期待が継続しています。

【下落・軟調】自動車・輸出の一部

  • トヨタ自動車 (7203)

    • 騰落状況: 対東証比 -0.5%〜+0.2%(もみ合い)。

    • 背景: 円安はプラス材料ですが、米国の景気減速懸念(一般消費財の弱含み)が上値を抑えています。

※この記事は投資を勧めるものではありません。投資は自己責任でお願いします。

NoLang 使い方|中小企業診断のプレゼン動画をAIで爆速で作る方法

  動画生成AIのNoLang(https://no-lang.com/)を活用し、

AI時代の中小企業診断/共通事項/プレゼンテーション作成


で生成したプレゼンテーション資料を読み込ませ、動画プレゼンテーションを生成しました。
無償版では月間の作業量制限があるので注意が必要です。画期的な速さで生成されます。
初回ヒアリングで仮設をプレゼンする新たな診断スタイルが可能になるかも知れません。



2026年1月3日土曜日

PythonでOutlook下書き自動作成|エクセルから一括生成するコード公開

 業務分析を行って負荷のかかっている単純作業があった場合、AIを活用してpythonプログラムを作成し、コストをかけずに解決策を提示することも可能です。
ここでは顧客への大量のメール送信を自動化する例を示します。

■想定シーン
既存顧客向けにチラシ等の添付ファイル付お知らせメールを大量に送信する。ここでは下書き作成まで自動化し、送信は目視確認兼ねて手動を想定する。

■事前準備
1.python開発環境Anacondaのインストール
 以下のサイト等を参考に実施ください。
 https://www.python.jp/install/anaconda/
2.ライブラリの事前インストール
 メール操作に必要なライブラリを先にインストールする必要があります。
 以下のコマンドをAnaconda Promptから入力ください。
 pip install pywin32 pandas openpyxl xlrd
3.データの準備
 以下のようなエクセルシートにデータを準備ください。


 以下のテキストを準備ください。
  テキストデータA ⇒件名を記載したもの
  テキストデータB ⇒本文を記載したもの
 添付ファイルを保存するフォッルダに添付ファイル(複数可能)を保存
 下書格納用のフォルダ

4.プログラミング
以下のプロンプトでAI(今回はcopilot)に指示してください。
---------------
アウトルック(windows)メールの下書き(.msg)をGUIから任意に選択するフォルダに作成するpythonプログラム
を作って下さい。(送信は決してしない)
GUIから任意のエクセルファイルを選択、そのエクセルの1行目は項目名、
エクセルの2行目以降の全行についてアウトルックメール下書きを作成してください。下書きメールの各項目を以下のように設定する。
宛先(T)には選択したエクセルファイルの項目「メールアドレス」を設定
件名(U)にはGUIで任意に選択するテキストデータA
添付ファイル GUIから任意に選択するフォルダーにある全てのファイルを添付する 
本文 1行目 エクセルファイルの項目「メール宛先」複数行の場合は改行を生かして複数行に記載
   空白行を1行挿入
   GUIで任意に選択するテキストデータBを貼り付ける
ファイル名:1行目に設定したエクセルファイルの項目「メール宛先」改行なし
---------------
以下のようにプログラムを生成してくれます。



⇒コードをコピーしてメモ帳でファイル名「create_outlook_drafts_msg.py」で保存

5.実行
 以下のコマンドをAnaconda Promptから入力ください。
 cd プログラムの存在するフォルダ名
 python create_outlook_drafts_msg.py
 ⇒GUIの指示に従って準備したリストなどを選択

全て選択すればメール下書きが指定フォルダに自動作成されます。


■エラー時の対処
 Anaconda Promptに表示されるエラーメッセージをAIに読み込ませるとデバックしてくれます。
 例えば指定するファイルが開かれているとエラーになります。

■コード全文

# -*- coding: utf-8 -*-
import os
import re
import sys
import traceback

import pandas as pd

EXCEL_ENGINE_XLSX = "openpyxl"
EXCEL_ENGINE_XLS = "xlrd"
OL_SAVEAS_MSG = 3

# GUI
import tkinter as tk
from tkinter import filedialog, messagebox

# Outlook COM
import win32com.client as win32
import pythoncom


def log(msg):
    print(msg, flush=True)


def read_text_file(path):
    for enc in ("utf-8", "cp932"):
        try:
            with open(path, "r", encoding=enc) as f:
                return f.read()
        except Exception:
            continue
    with open(path, "rb") as f:
        return f.read().decode("utf-8", errors="replace")


def sanitize_filename(name):
    """Windows の禁止文字を置換し、長過ぎる場合は短縮"""
    name = re.sub(r'[\\/:*?"<>|]+', "_", str(name))
    name = name.strip()
    return (name[:100] or "no_subject")


def load_excel_dataframe(excel_path):
    ext = os.path.splitext(excel_path)[1].lower()
    if ext == ".xlsx":
        df = pd.read_excel(excel_path, engine=EXCEL_ENGINE_XLSX)
    elif ext == ".xls":
        df = pd.read_excel(excel_path, engine=EXCEL_ENGINE_XLS)
    else:
        try:
            df = pd.read_excel(excel_path, engine=EXCEL_ENGINE_XLSX)
        except Exception:
            df = pd.read_excel(excel_path)
    return df


def ensure_outlook():
    try:
        pythoncom.CoInitialize()
    except Exception:
        pass
    log("[INFO] Outlook.Application を取得します...")
    outlook = win32.Dispatch("Outlook.Application")
    log("[INFO] Outlook.Application 取得済み")
    return outlook


def collect_attachments(attach_folder):
    files = []
    try:
        entries = os.listdir(attach_folder)
    except Exception:
        entries = []
    for entry in entries:
        fp = os.path.join(attach_folder, entry)
        if os.path.isfile(fp):
            files.append(fp)
    return files


def build_body_linebreaks(text):
    if text is None:
        return ""
    s = str(text)
    s = s.replace("\r\n", "\n").replace("\r", "\n")
    return s.replace("\n", "\r\n")


def create_msg_draft(outlook, to_addr, subject, body_text, attachments, save_dir, index, filename_label=""):
    """
    1件分の MailItem を作成し、.msg で保存(送信しない)。
    ファイル名ラベルに「メール宛先」1行目(改行なし)を使う。
    """
    mail = outlook.CreateItem(0)  # olMailItem
    mail.To = to_addr or ""
    mail.Subject = subject or ""
    mail.Body = body_text or ""

    for fp in attachments:
        try:
            mail.Attachments.Add(fp)
        except Exception as e:
            log(f"[WARN] 添付失敗: {fp} => {e}")

    # ---- ファイル名の組み立て(指定仕様)----
    # メール宛先(1行目・改行なし)をラベルに
    safe_label = sanitize_filename(filename_label or "")
    safe_subject = sanitize_filename(subject or "")
    base_name = f"{index:03d}_{safe_label}_{safe_subject}"
    out_path = os.path.join(save_dir, base_name + ".msg")

    mail.SaveAs(out_path, OL_SAVEAS_MSG)
    return out_path


def ask_file(title, patterns, parent):
    path = filedialog.askopenfilename(parent=parent, title=title, filetypes=patterns)
    log(f"[DEBUG] 選択結果: {title} => {path if path else '(未選選択)'}")
    return path


def ask_dir(title, parent):
    path = filedialog.askdirectory(parent=parent, title=title)
    log(f"[DEBUG] 選択結果: {title} => {path if path else '(未選択)'}")
    return path


def console_fallback(prompt):
    log(f"[FALLBACK] {prompt}")
    try:
        path = input("> 入力(空でスキップ): ").strip()
    except EOFError:
        path = ""
    return path


def main():
    print(f"[ENV] Python: {sys.executable}", flush=True)

    root = tk.Tk()
    root.title("Outlook下書き作成ツール")
    root.geometry("300x50+100+100")
    root.attributes("-topmost", True)
    root.lift()

    try:
        try:
            root.call("tk", "scaling", 1.3)
        except Exception:
            pass

        messagebox.showinfo("開始", "処理を開始します。ダイアログに従って選択してください。", parent=root)

        log("[STEP] エクセルファイル選択")
        excel_path = ask_file(
            "エクセルファイルを選択してください(1行目が項目名)",
            [("Excel files", "*.xlsx;*.xls"), ("All files", "*.*")],
            parent=root
        )
        if not excel_path:
            excel_path = console_fallback("GUIが表示されない場合、エクセルファイルのフルパスを入力してください。")
        if not excel_path or not os.path.isfile(excel_path):
            messagebox.showerror("エラー", "エクセルファイルが選択/入力されていません。処理を中止します。", parent=root)
            log("[ERROR] エクセル未選択")
            return

        log("[STEP] 件名用テキスト(A)選択")
        subject_text_path = ask_file(
            "件名用テキスト(A)ファイルを選択してください",
            [("Text files", "*.txt;*.csv;*.md"), ("All files", "*.*")],
            parent=root
        )
        if not subject_text_path:
            subject_text_path = console_fallback("件名用テキスト(A)ファイルのフルパスを入力してください。")
        if not subject_text_path or not os.path.isfile(subject_text_path):
            messagebox.showerror("エラー", "件名用テキスト(A)が選択/入力されていません。処理を中止します。", parent=root)
            log("[ERROR] 件名A未選択")
            return
        subject_text = read_text_file(subject_text_path).strip()

        log("[STEP] 本文用テキスト(B)選択")
        body_b_path = ask_file(
            "本文用テキスト(B)ファイルを選択してください",
            [("Text files", "*.txt;*.csv;*.md"), ("All files", "*.*")],
            parent=root
        )
        if not body_b_path:
            body_b_path = console_fallback("本文用テキスト(B)ファイルのフルパスを入力してください。")
        if not body_b_path or not os.path.isfile(body_b_path):
            messagebox.showerror("エラー", "本文用テキスト(B)が選択/入力されていません。処理を中止します。", parent=root)
            log("[ERROR] 本文B未選択")
            return
        body_b = read_text_file(body_b_path)

        log("[STEP] 添付フォルダ選択")
        attach_folder = ask_dir("添付ファイルを含むフォルダを選択してください", parent=root)
        if not attach_folder:
            attach_folder = console_fallback("添付フォルダのフルパスを入力してください。")
        if not attach_folder or not os.path.isdir(attach_folder):
            messagebox.showerror("エラー", "添付フォルダが選択/入力されていません。処理を中止します。", parent=root)
            log("[ERROR] 添付フォルダ未選択")
            return
        attachments = collect_attachments(attach_folder)
        log(f"[INFO] 添付件数: {len(attachments)}")

        log("[STEP] 保存先フォルダ選択")
        save_dir = ask_dir(".msg の保存先フォルダを選択してください", parent=root)
        if not save_dir:
            save_dir = console_fallback(".msg 保存先フォルダのフルパスを入力してください。")
        if not save_dir or not os.path.isdir(save_dir):
            messagebox.showerror("エラー", "保存先フォルダが選択/入力されていません。処理を中止します。", parent=root)
            log("[ERROR] 保存先未選択")
            return

        log("[STEP] エクセル読み込み")
        try:
            df = load_excel_dataframe(excel_path)
        except Exception as e:
            messagebox.showerror("エラー", f"エクセルの読込に失敗しました:\n{e}", parent=root)
            log(f"[ERROR] エクセル読込失敗: {e}")
            return

        required_cols = ["メールアドレス", "メール宛先"]
        missing = [c for c in required_cols if c not in df.columns]
        if missing:
            messagebox.showerror("エラー", f"エクセルに必須列がありません: {missing}\n(列名は完全一致で「メールアドレス」「メール宛先」)", parent=root)
            log(f"[ERROR] 必須列不足: {missing}")
            return

        outlook = ensure_outlook()

        created_paths = []
        for i, row in df.iterrows():
            to_addr = str(row.get("メールアドレス") or "").strip()
            dest_text = row.get("メール宛先")
            if pd.isna(dest_text):
                dest_text = ""
            # ---- ファイル名用の「メール宛先」1行目(改行なし)を抽出 ----
            dest_firstline = ""
            if str(dest_text).strip():
                # splitlines() は \r\n, \r, \n すべてに対応。先頭行のみ使用。
                dest_firstline = str(dest_text).splitlines()[0]
                # 改行は含めない仕様なので、念のため改行文字を除去
                dest_firstline = dest_firstline.replace("\r", "").replace("\n", "")

            # 本文 = 「メール宛先」(改行保持) + 空白行 + B
            body_full = build_body_linebreaks(dest_text) + "\r\n\r\n" + build_body_linebreaks(body_b)

            try:
                out_path = create_msg_draft(
                    outlook=outlook,
                    to_addr=to_addr,
                    subject=subject_text,
                    body_text=body_full,
                    attachments=attachments,
                    save_dir=save_dir,
                    index=i + 2,  # ヘッダーが1行目のため
                    filename_label=dest_firstline or to_addr or "no_label",  # 空ならメールアドレス等でフォールバック
                )
                created_paths.append(out_path)
                log(f"[OK] Saved: {out_path}")
            except Exception as e:
                log(f"[ERROR] 行 {i+2} の下書き作成に失敗: {e}")
                traceback.print_exc()

        message = f"下書き(.msg)の作成が完了しました。\n作成数: {len(created_paths)} 件\n保存先: {save_dir}"
        messagebox.showinfo("完了", message, parent=root)
        log("[DONE] " + message)

    except Exception as e:
        traceback.print_exc()
        messagebox.showerror("エラー", f"処理中にエラーが発生しました:\n{e}", parent=root)
        log(f"[FATAL] {e}")
    finally:
        try:
            root.destroy()
        except Exception:
            pass


if __name__ == "__main__":
    main()






AIサブスクリプションサービス提供会社

 主に企業向けのAIサブスクリプションサービスの提供企業を一覧にしてみました。











カスタマージャーニーマップ【ペルソナ(仮想顧客)分析】

 以下の記事で作成したカスタマージャーニーマップを活用してAIにペルソナ(仮想顧客)になってもらい、インタビューと行動分析を行いました。国政を仮のテーマにしていますが、企業診断では中小企業の課題に置き換えてお考え下さい。こうして具体的に壁打ちすることによりカスタマージャーニーが洗練されていきます。

AI時代のセカンドライフ: カスタマージャーニーマップ

■ペルソナプロフィール

18歳女性、大学生、両親と弟と同居、横浜市在住、趣味はゲームとカフェ巡り、有権者となり女性総理も誕生したので政治に少し興味が湧いている。

■質問と回答

質問1:日本初の女性総理が誕生して何か変わると感じますか。

はい、少し変わると感じます。政治がより身近になった気がします。


質問2:そう感じた理由を少し具体的に教えてください。

今まで総理といえば遠い存在で、自分とは関係ないと思っていました。でも女性総理が誕生したことで、「自分と同じ女性が国のトップになれるんだ」と思うと、政治が自分にも関係あると感じられるようになりました。


質問3:今後の政治に期待したいことは何ですか。

若者や女性の意見がもっと反映される仕組みを作ってほしいです。例えば、教育費の負担軽減や、就職支援、ジェンダー平等の推進などです。


質問4:選挙があれば自分は投票したいと思いますか。

はい、投票したいと思います。今まではあまり関心がなかったけど、今回のことで「自分の一票で何か変わるかもしれない」と思えるようになりました。

■国政に意見をするまでの行動シミュレーション:意見投稿までの流れ

ステップ1:認知

  • SNSで「女性総理誕生」ニュースを見て、政治に興味が湧く。
  • 「自分の意見を国に届けられる方法があるのかな?」と考える。

ステップ2:情報収集

  • Googleで「首相官邸 意見投稿」と検索。
  • 検索結果から「ご意見・ご感想」ページをクリック。
  • ページを見て、「フォームで送れるんだ」と理解。

ステップ3:フォーム入力準備

  • テーマを決める:「若者の教育費負担軽減」。
  • 文字数制限(2,000字以内)を確認。
  • 不安:「ちゃんと届くのかな?」「個人情報は安全?」

ステップ4:フォーム入力

  • 「分野」→ 教育、「テーマ」→ 奨学金制度。
  • 本文:「大学生の負担を減らすため、奨学金の返済条件を改善してほしい」など記入。
  • メールアドレスは任意なので入力するか迷うが、入力して送信。

ステップ5:送信・確認

  • 送信後、「ご意見を受け付けました」のメッセージを確認。
  • 受付番号や返信はないので少し不安。

ステップ6:フォローアップ

  • 「自分の意見はどうなるんだろう?」と思い、パブコメ結果ページを探すが分かりにくい。
  • 継続的に関わる仕組みがないので、次回はSNSで情報を探すかも。

👉 このシミュレーションから見える課題:

  • 不安要素:届いたかどうか、反映されるか不透明。
  • 改善案:受付番号付きメール、意見集計公開、簡単な進捗確認機能。


2026年1月2日金曜日

アサヒグループHD(2502)サイバー攻撃(記事化)

 アサヒグループHDのサイバー攻撃:物流正常化までの損失試算と株価の行方

をCOPILOTに字数指定で以下のように記事化してもらいました。

※この記事は投資を勧めるものではありません。投資は自己責任でお願いします。

---------------------

アサヒグループHD(2502)—サイバー攻撃後の株価と需給の行方

アサヒグループHDは2025年9月末、ランサムウェア「Qilin」による攻撃を受け、国内の受注・出荷系システムが長期混乱に陥った。同社は、個人情報約191万件の漏えい可能性と復旧計画を11月27日に公表し、物流の完全正常化は2026年2月を目標とする(復旧ステータス、再発防止策)。犯行声明は10月7日に確認され、侵入経路は拠点のネットワーク機器(VPNが疑われる)からデータセンターへの横展開とされる。 [irbank.net], [tradetnews.com] [asahigroup...ldings.com], [filingreader.com]

株価は1,650~1,750円のレンジで推移。足元の理論株価はシナリオ次第で振れ幅が大きい。会社計画どおり1月に実務正常化へ進む「強気」ではEPS約114.5円(自社株買い後前提)、PER=17.56倍なら約2,011円が目安。一方、復旧が2月までずれ込む「中立」ではEPS約80円、理論値は約1,410円。さらに4月まで遅延する「弱気」ではEPS約46円で約810円までの下振れ余地が生じる(BPSは1,777.6円を基準に損益を簡易反映)。PBR比較では3,600円台が示唆されるが、減益期のPBRは過大評価を招きやすく留意が必要だ。 [bloomberg.com], [itmedia.co.jp] [irbank.net]

需給面の焦点は自社株買いの終了タイミングだ。上限4,500万株・700億円のプログラムは10~12月実施で、11月までに3,109万株・538.9億円を取得済み。残りは約1,611億円相当の枠があり、株価1,700円前後なら約950万株程度の追加にとどまり、株数上限には非到達の見込みである(12/23終了時点)。よって自社株買いという恒常需要が年末で消失し、短期のボラティリティ上昇が想定される。さらに、同社が東アフリカ事業の大型買収を発表したことで、来期以降の買戻し延期観測が需給の逆風となり得る8。 [trendmicro.com], [itmedia.co.jp] [asahigroup...ldings.com]

結論として、短期は需給悪化とニュースフロー次第で下振れリスクが優勢。中期は2月の正常化確認がカギで、強気シナリオの2,000円台再評価に道が開く。長期はネットワーク再設計・ゼロトラスト・BCP再構築でEPSのボトムが切り上がれば、事業構造の回復と海外展開の評価が進む。投資判断では、復旧進捗の定着(業務KPI)と自社株買いの来期方針を主要カタリストとして注視したい。 [irbank.net], [filingreader.com]




アサヒグループHDのサイバー攻撃:物流正常化までの損失試算と株価の行方

 ■ハイライト
2025年9月末ロシア語圏ハッカー攻撃後長期間でランサムウェア感染し、国内基幹システムが停止。物流正常化は2026年2月目標。
現時点の理論価格を下回る1650円~1750円で株価推移するも、月次の減収平均200億円は止まっておらず、2月正常化までは大きく下げる場面もあるのではないか。

※この記事は投資を勧めるものではありません。投資は自己責任でお願いします。

■理由

・2024年6月ニコニコ動画を含むKADOKAWAグループのサイバー攻撃では、サービス完全再開するまで株価軟調に推移したことから、サイバー被害の株価転換点はサービス完全復旧である可能性がある。
・復旧に2月まで要した場合の被害想定を1000億円と試算。この場合PER基準株価を 1,088円と算定。現状の株価を下回る。
・需給は外国勢と思われる機関投資家の空売(松井証券売買分析では40%台の高率)に対し
 個人の信用買(信用倍率7倍)、三井住友信託等の買い増し、最大3%の自社株買い等で拮抗しているように見えるが、自社株買期間12月23日以降などバランスが崩れる可能性や、発生から情報開示まで約2カ月の遅れなど、投資家不安を誘う状況、この状況での大規模MAなど、買方に不安もある。

【参考】
■概況
アサヒグループHDは2025年9月末にランサムウェア攻撃を受け、国内基幹システムが停止。受注・出荷業務は長期混乱し、個人情報約191万件流出の可能性。完全復旧は未達で、物流正常化は2026年2月目標。

■時系列整理
9/18頃:侵入・偵察活動開始
9/29:サーバー暗号化、システム障害発覚(受注出荷システム全面停止)
10/7:犯行声明(Qilin)公表 約27GB(9,300件)の財務・従業員データを窃取したと主張
10/14:個人情報流出の可能性発表
11/27:被害規模(約191万件)公表
12月現在:受注システム一部再開、完全復旧は未達
2026/2予定:物流業務の正常化目標
※情報開示まで約2カ月の遅れ
記者会見が11月27日と、攻撃発覚(9月29日)から2カ月要した点や技術的説明無く批判された

■財務健全性
FCF 約2,242億円 支払利息約92.9億円 現金同等物 839.61億円  
自己資本比率 約49.4%(2024年12月期)   
ネットキャッシュ▲1兆1,952億 ネットキャッシュ比率 ▲22.1%
※有利子負債大だが返済能力高  
■損害推計
直接損失:約30億円超
業界影響含む試算:最大300億円規模
※以下月次推定からは更に拡大  保険カバーは直接的な復旧費用の6割程度
■月次影響 10月11月の前年同期比  と減収推定copilot
ビール 90%⇒7割  飲料 60%⇒7割 食品 70%⇒90%
10月 180億円減収 11月214億円減収  ほぼ同額減益と推定 

■理論株価
PER基準 予想EPS:112.74円/株 同業加重平均(17.56倍) → 112.74 × 17.56 ≈ 1,976円
PBR基準 BPS:1,777.6円/株   同業加重平均(2.09倍) → 1,777.6 × 2.09 ≈ 3,716円
アナリスト平均はおよそ2,300〜2,350円
2025/12/16会社予想の減益幅は245億円であるが、2月まで月平均200億円の減益となれば
1000億円減益となりPER基準では EPS  61.9 × 17.56 =  1,088円

■株価推移
2025年9月18日   1790円  
2025年9月29日  1776円  
2025年10月7日  1751円  
2025年10月14日 1716円
2025年10月31日 1661円   1番底
2025年11月27日 1787円  
2025年12月16日 1731円 
2025年12月18日 1647円  2番底 英ディアジオから東アフリカ事業M&A(約4654億円)負担を嫌気
                  
 
※理論株価から割安で推移
■株式需給
個人主体の信用倍率は7%代の買長 
三井住友信託買い増し
2025年12月23日まで発行済み株式3%上限の自社株買い期間 
松井証券売買分析では機関空売りは40%台の高水準で推移
空売りネットではSociete Generale Barclays Bank 12月に売り

※海外勢空売り、個人及び三井住友信託、自社株買い等で買い支えか?
参考事例
・カドカワサイバー被害:売上高約84億円減少。サービス再開が株価底
・HOYA:3週間で復旧も四半期営業利益が4割減少
・ジャガー:1か月生産停止

カスタマージャーニーマップ

 ■カスタマージャーニーマップとは

カスタマージャーニーマップとは、顧客が製品やサービスを認知し、利用や購入、フォローアップに至るまでの行動や接点を時系列で可視化する手法である。顧客の行動、感情、課題を整理し、体験全体を理解することで、企業は改善点を特定し、満足度やエンゲージメントを高める戦略を立案できる。サービスデザインやUX領域で発展し、顧客中心の施策に不可欠なツールである。

■中小企業診断での応用

営業分野での活用が期待される。ここでは国民による国政への意見を題材に具体例を示す。

■プロンプト copilot

ホームページから国政に意見を言いたい国民のカスタマージャーニーマップを作成して

⇒以降図解や国際比較、改善提案などを更問して以下を作成

    日本は意見提起はストレス無く出来るものの、個別回答が無く、一定署名で回答が成される海外のしくみと異なることが分かる。





AI時代のセカンドライフ/(ケースで学ぶ)行政書士試験への挑戦(伊東市、地方自治法) 

 ■ケース概要  首長の学歴詐称疑惑を発端に、「首長 vs 議会」の対立が極限まで達し、不信任議決・議会解散・再度の不信任による失職、さらには百条委員会での偽証による刑事訴追にまで発展した、地方自治法史上でも極めて稀なケースです。 ■時系列と関連法規 年月 出来事 地方自治法上の...