カテゴリー: 説明

  • Linux開発環境

    docker

    状況コマンド例説明
    起動(バックグラウンド)docker compose up -d初回または再起動用
    停止(再起動しやすい)docker compose stop状態を維持したまま停止
    再起動docker compose startstop後の再開
    完全に削除(消える)docker compose down -vデータ・ボリュームも削除

    systemサービス

    操作コマンド例
    起動sudo systemctl start xxx.service
    停止sudo systemctl stop xxx.service
    有効化(起動時)sudo systemctl enable xxx.service
    無効化sudo systemctl disable xxx.service
    状態確認sudo systemctl status xxx.service
    ログ確認journalctl -u xxx.service -e

    sudo systemctl start redis
    sudo systemctl start cerely
    sudo systemctl start mailanalisys

  • MSYS2

    MSYS2をインストールすると、複数の異なるシェル(ターミナル)が登録されます。それぞれの役割を説明します。


    1. MSYS2 MSYS

    • 用途: UNIXライクな環境を提供
    • コンパイラ: なし(基本的なPOSIX互換環境)
    • パス: /usr/bin
    • 適用例: bashtar などのPOSIXコマンドを実行
    • 主な使用場面:
      • MSYS2自体のメンテナンス(pacman によるパッケージ管理)
      • POSIX互換環境が必要な作業

    2. MSYS2 MINGW64

    • 用途: 64bit のWindowsネイティブアプリ(MinGW-w64)開発環境
    • コンパイラ: mingw-w64-x86_64-gcc
    • パス: /mingw64/bin
    • 適用例: g++gcc を使用して64bit Windowsアプリをコンパイル
    • 主な使用場面:
      • 64bit Windowsネイティブアプリの開発
      • cmake を使ったビルド
      • Visual Studio Code(VSC)との連携で使用推奨

    3. MSYS2 UCRT64

    • 用途: 64bit Windowsネイティブアプリ(UCRTベース)の開発環境
    • コンパイラ: mingw-w64-ucrt-x86_64-gcc
    • パス: /ucrt64/bin
    • 適用例: g++gcc を使用してUCRTを利用した64bit Windowsアプリをコンパイル
    • 主な使用場面:
      • Universal C Runtime(UCRT)を使ったプログラム開発
      • Windowsの標準CRT(MSVCRT)よりも最新のUCRTを使用したい場合

    4. MSYS2 CLANG64

    • 用途: 64bit Windowsネイティブアプリ(Clangベース)の開発環境
    • コンパイラ: clang
    • パス: /clang64/bin
    • 適用例: clang++clang を使用してWindows向けのアプリをコンパイル
    • 主な使用場面:
      • Clangベースのコンパイラを利用したい場合
      • Clangを使ったパフォーマンス最適化

    5. MSYS2 CLANGARM64

    • 用途: ARM64(AArch64)向けのWindowsアプリを開発
    • コンパイラ: clang(ARM64向け)
    • パス: /clangarm64/bin
    • 適用例: clang++clang を使ってARM64 Windows向けアプリを開発
    • 主な使用場面:
      • ARM64アーキテクチャ向けのソフトウェア開発(例: Windows on ARM)
      • Clangを利用したクロスコンパイル

    どれを使えばよいか?

    • C++(GCC)開発ならMINGW64(64bit開発)
    • UCRT(新しいランタイム)を使いたいならUCRT64
    • Clangを使うならCLANG64
    • ARM64向け開発ならCLANGARM64
    • MSYS2のパッケージ管理を行うならMSYS2 MSYS

    おすすめの使い方(VSCでの開発)

    Visual Studio CodeでC++開発を行うなら MSYS2 MINGW64 を使うのが一般的です。

    • MINGW64の環境を開き、以下のコマンドでC++ツールをインストール: pacman -S mingw-w64-x86_64-toolchain
    • その後、VS Codeの「ターミナル」→「デフォルトプロファイル」を MSYS2 MINGW64 に設定。

    まとめ

    シェル用途コンパイラ
    MSYS2 MSYSMSYS2環境のメンテナンスなし
    MSYS2 MINGW6464bit Windowsアプリ開発mingw-w64-x86_64-gcc
    MSYS2 UCRT64UCRTベースの64bitアプリ開発mingw-w64-ucrt-x86_64-gcc
    MSYS2 CLANG64Clangを使った64bitアプリ開発clang
    MSYS2 CLANGARM64ARM64 Windows向け開発clang

    この情報を参考に、自分の開発用途に合ったものを選んでください!

  • WordPressのURL変更

    WordPressのURL変更

    WordPressで投稿や固定ページのURLに「wp」や「?p=」と表示されないようにするには、パーマリンク設定を変更する必要があります。具体的な手順は以下の通りです:

    手順

    1. WordPressのダッシュボードにログイン
      • WordPressにログイン後、管理画面に移動します。
    2. パーマリンク設定の変更
      • 左側のメニューから「設定」→「パーマリンク設定」を選択します。
    3. 希望のURL構造を選択
      • パーマリンク設定画面で、「投稿名」や「カスタム構造」などを選択できます。例えば、「投稿名」を選択すると、URLがhttps://example.com/投稿名/という形になります。
      • カスタム構造を使いたい場合は、以下のように設定することもできます: /%category%/%postname%/
      これにより、投稿ごとにカテゴリーや投稿名を反映させたURLになります。
    4. 変更を保存
      • 設定を変更したら、「変更を保存」ボタンをクリックして、設定を反映させます。

    注意点

    • もし「?p=」のようなURLが表示されている場合、それは「デフォルト」設定になっているため、「投稿名」や「カスタム構造」を選択することで、そのようなURLを回避できます。
    • 上記の設定を変更しても、すでに公開されているページや投稿に変更が必要な場合があります。場合によってはリダイレクト設定が必要になることもあります。

    これで、WordPressの投稿や固定ページのURLがより分かりやすい形で表示されるようになります。

    「パーマリンク設定でwpが必ず表示される」という場合、いくつかの原因が考えられます。通常、WordPressの標準パーマリンク設定ではwpがURLに表示されることはありません。ですが、以下の原因や解決方法が考えられます。

    1. WordPressインストール場所がサブディレクトリの場合

    • 原因: WordPressをサブディレクトリ(例えばexample.com/wp/)にインストールしている場合、wpがURLに含まれることがあります。この場合、WordPressのURLとサイトのURLが異なることが原因です。
    • 解決方法:
      1. WordPressのインストール先を確認: 管理画面の「設定」→「一般」で「WordPress アドレス (URL)」と「サイトアドレス (URL)」が正しく設定されているか確認します。
      2. 「サイトアドレス (URL)」をhttps://example.com/に設定し、「WordPress アドレス (URL)」をhttps://example.com/wpのように、wpディレクトリに合わせる場合があります。

    2. .htaccessファイルの設定

    • 原因: サーバーの.htaccessファイルが正しく設定されていない場合、パーマリンクの設定が正しく反映されないことがあります。
    • 解決方法:
      1. 管理画面の「設定」→「パーマリンク設定」に移動し、設定を再保存します。これにより、.htaccessが自動的に更新されます。
      2. もし手動でwpディレクトリにインストールされている場合、.htaccessファイル内でパーマリンク設定が正しく反映されるように記述を確認してください。例えば、次のような記述です: RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /wp/index.php [L]

    3. プラグインの影響

    • 原因: 一部のプラグインがURLにwpを追加することがあります。特に、キャッシュやSEO関連のプラグインが影響を与えていることがあります。
    • 解決方法:
      1. プラグインを無効にして、URLが変更されるか確認します。特に、キャッシュプラグイン(例: W3 Total Cache、WP Super Cache)や、SEOプラグイン(例: Yoast SEO)が影響を与えることがあります。
      2. 1つずつプラグインを再有効化して、どのプラグインが原因か特定します。

    4. テーマやカスタム設定

    • 原因: 使用しているテーマやカスタムコードがwpをURLに追加している可能性があります。
    • 解決方法: 使用中のテーマやカスタムコードを確認し、URL設定に関わる部分を見直してください。wpを強制的に含めるコードが記述されていないかチェックします。

    まとめ

    まずは、インストール先や.htaccessファイルの設定を確認し、次にプラグインやテーマが影響しているかどうかを確認するのが良いでしょう。それでも問題が解決しない場合は、サーバー側の設定やWordPressの再インストールを考慮することも必要かもしれません。

  • JavaScriptの基本文法

    JavaScriptの基本文法

    JavaScriptの基本的な文法について簡単に紹介します。

    1. 変数の宣言

    変数は、varletconstを使って宣言できます。

    let name = "太郎";  // 再代入可能
    const age = 30;     // 再代入不可
    var city = "東京";  // 古い方法(letやconstが推奨されます)
    

    2. データ型

    JavaScriptには、いくつかの基本的なデータ型があります。

    • 数値 (Number)
    • 文字列 (String)
    • 論理値 (Boolean)
    • 配列 (Array)
    • オブジェクト (Object)
    • nullundefined
    let number = 100;           // 数値
    let name = "太郎";           // 文字列
    let isTrue = true;           // 論理値
    let numbers = [1, 2, 3];    // 配列
    let person = { name: "太郎", age: 30 }; // オブジェクト
    

    3. 関数

    関数は、functionキーワードを使って定義します。

    function greet(name) {
      console.log("こんにちは、" + name + "さん!");
    }
    
    greet("太郎"); // 実行結果: こんにちは、太郎さん!
    

    アロー関数(ES6以降)

    アロー関数は簡潔に関数を定義できます。

    const greet = (name) => {
      console.log("こんにちは、" + name + "さん!");
    };
    
    greet("太郎"); // 実行結果: こんにちは、太郎さん!
    

    4. 条件分岐

    if文やswitch文を使って条件を分岐できます。

    let age = 20;
    
    if (age >= 18) {
      console.log("成人です");
    } else {
      console.log("未成年です");
    }
    

    5. 繰り返し処理

    forループやwhileループで繰り返し処理を行えます。

    // forループ
    for (let i = 0; i < 5; i++) {
      console.log(i);  // 0, 1, 2, 3, 4
    }
    
    // whileループ
    let i = 0;
    while (i < 5) {
      console.log(i);  // 0, 1, 2, 3, 4
      i++;
    }
    

    6. オブジェクト

    オブジェクトはキーと値のペアを持つデータ型です。

    let person = {
      name: "太郎",
      age: 30,
      greet: function() {
        console.log("こんにちは、" + this.name + "です");
      }
    };
    
    console.log(person.name);  // 太郎
    person.greet();            // こんにちは、太郎です
    

    7. 配列

    配列は複数の値を格納できるデータ型です。

    let fruits = ["りんご", "バナナ", "みかん"];
    
    console.log(fruits[0]); // りんご
    fruits.push("ぶどう");  // 配列の末尾に追加
    console.log(fruits);    // ["りんご", "バナナ", "みかん", "ぶどう"]
    

    8. 非同期処理 (Promise)

    JavaScriptでは非同期処理をPromiseasync/awaitを使って扱います。

    // Promiseの例
    let promise = new Promise((resolve, reject) => {
      let success = true;
      if (success) {
        resolve("成功!");
      } else {
        reject("失敗");
      }
    });
    
    promise.then(result => {
      console.log(result); // "成功!"
    }).catch(error => {
      console.log(error); // "失敗"
    });
    

    これがJavaScriptの基本的な文法の概要です。興味のあるトピックがあれば、もっと詳しく説明できますので、気軽に聞いてください!

  • PHP基本文法

    PHP基本文法

    PHPはサーバーサイドで動作するスクリプト言語で、主にウェブ開発に使用されます。以下にPHPの基本文法を紹介します。

    1. PHPタグ

    PHPのコードは <?php?> で囲む必要があります。

    <?php
      // PHPのコードがここに入ります
    ?>
    

    2. 変数

    変数は $ で始まり、文字列や数値などのデータを格納できます。

    <?php
    $variable = "Hello, PHP!";
    echo $variable;  // 出力: Hello, PHP!
    ?>
    

    3. コメント

    PHPでは2種類のコメント形式が使用できます。

    • 単一行コメント: // または #
    • 複数行コメント: /* コメント */
    <?php
    // これは単一行コメント
    # これも単一行コメント
    
    /* これは
       複数行コメントです */
    ?>
    

    4. 配列

    PHPでは、array() 関数を使って配列を作成できます。また、PHP 5.4以降、短縮構文 [] も使用できます。

    <?php
    // 通常の配列
    $fruits = array("Apple", "Banana", "Orange");
    
    // 短縮配列
    $colors = ["Red", "Green", "Blue"];
    ?>
    

    5. 条件分岐 (if, else)

    PHPでは、if 文や else 文で条件分岐が可能です。

    <?php
    $age = 20;
    
    if ($age >= 18) {
        echo "成人です";
    } else {
        echo "未成年です";
    }
    ?>
    

    6. ループ (for, while, foreach)

    PHPにはいくつかのループ構文があります。

    forループ

    <?php
    for ($i = 0; $i < 5; $i++) {
        echo $i . "<br>";
    }
    ?>
    

    whileループ

    <?php
    $i = 0;
    while ($i < 5) {
        echo $i . "<br>";
        $i++;
    }
    ?>
    

    foreachループ(配列やオブジェクトに便利)

    <?php
    $fruits = ["Apple", "Banana", "Orange"];
    
    foreach ($fruits as $fruit) {
        echo $fruit . "<br>";
    }
    ?>
    

    7. 関数

    関数を定義するには function キーワードを使います。

    <?php
    function greet($name) {
        return "Hello, " . $name . "!";
    }
    
    echo greet("Taro");  // 出力: Hello, Taro!
    ?>
    

    8. 連想配列

    連想配列ではキーと値をセットで格納します。

    <?php
    $user = [
        "name" => "Taro",
        "age" => 25,
        "city" => "Tokyo"
    ];
    
    echo $user["name"];  // 出力: Taro
    ?>
    

    9. 定数

    定数を定義するには define() 関数を使います。

    <?php
    define("PI", 3.14159);
    echo PI;  // 出力: 3.14159
    ?>
    

    10. クラスとオブジェクト

    PHPではオブジェクト指向プログラミングが可能で、クラスを定義できます。

    <?php
    class Person {
        public $name;
        public $age;
    
        function __construct($name, $age) {
            $this->name = $name;
            $this->age = $age;
        }
    
        function greet() {
            return "Hello, " . $this->name . "!";
        }
    }
    
    $person = new Person("Taro", 25);
    echo $person->greet();  // 出力: Hello, Taro!
    ?>
    

    これらはPHPの基本的な文法です。PHPは非常に強力で、柔軟な言語であり、ウェブ開発で広く使用されています。

  • python基本文法

    python基本文法

    Pythonの基本的な文法について簡単に紹介します。

    1. 変数とデータ型

    Pythonでは変数の宣言時に型を指定する必要はありません。値を代入するだけで変数が作成されます。

    # 数値
    x = 10
    
    # 文字列
    name = "Taro"
    
    # リスト
    fruits = ["apple", "banana", "cherry"]
    
    # 論理値
    is_active = True
    

    2. コメント

    コードにコメントを追加するには、#を使います。

    # これはコメントです
    print("Hello, World!")  # この行もコメント
    

    3. 演算子

    基本的な演算子は以下の通りです。

    # 算術演算子
    a = 5
    b = 3
    print(a + b)  # 加算
    print(a - b)  # 減算
    print(a * b)  # 乗算
    print(a / b)  # 除算
    print(a // b) # 整数除算
    print(a % b)  # 剰余
    print(a ** b) # 累乗
    

    4. 条件分岐

    Pythonではif文を使って条件分岐を行います。

    age = 20
    
    if age >= 18:
        print("成人です")
    else:
        print("未成年です")
    

    5. ループ

    forループやwhileループを使って繰り返し処理を行います。

    # forループ
    for i in range(5):  # 0から4まで繰り返す
        print(i)
    
    # whileループ
    counter = 0
    while counter < 5:
        print(counter)
        counter += 1
    

    6. 関数

    Pythonではdefを使って関数を定義します。

    def greet(name):
        return "Hello, " + name
    
    print(greet("Taro"))
    

    7. リストとタプル

    • リストは変更可能なデータ構造です。
    • タプルは変更不可能なデータ構造です。
    # リスト
    fruits = ["apple", "banana", "cherry"]
    fruits.append("orange")  # 新しい要素の追加
    print(fruits)
    
    # タプル
    colors = ("red", "green", "blue")
    # colors[0] = "yellow"  # エラー: タプルは変更できない
    

    8. 辞書

    辞書はキーと値のペアでデータを管理します。

    person = {"name": "Taro", "age": 20}
    print(person["name"])  # Taro
    person["age"] = 21  # 値の更新
    

    9. クラスとオブジェクト

    Pythonはオブジェクト指向言語でもあります。クラスを定義してオブジェクトを作成します。

    class Dog:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def bark(self):
            return "Woof!"
    
    dog1 = Dog("Rex", 5)
    print(dog1.name)  # Rex
    print(dog1.bark())  # Woof!
    

    10. 例外処理

    エラーが発生する可能性があるコードをtryブロックで囲み、エラーをexceptで処理します。

    try:
        x = 10 / 0
    except ZeroDivisionError:
        print("ゼロで割ることはできません")
    

    これらがPythonの基本的な文法です。慣れることで、さらに高度な機能を使いこなすことができるようになります。

  • Claudeが優秀

    Claudeが優秀

    プログラムとかワードプレスなどで、わからない時やエラーがあるとChatGPTやClaudeなどなどのAIで確認するが、Claudeが一番適格な答えをしてくれる。プロンプトの問題もあるかもしれないが、プロンプト作成にそんなに時間を取られたくないので、簡単なプロンプトでもちゃんと答えてくれるのがClaudeだった。

    ChatGPT

    files-list.js に関連する読み込み設定は、親テーマの functions.php や他のスクリプトファイルに記述されている可能性がありますが、先程検索した結果では特に親テーマで直接 files-list.js を読み込んでいるコードが見当たりませんでした。

    したがって、次のように確認する方法を提案します:

    1. 親テーマの functions.php の全コードを確認 親テーマで files-list.js を読み込む設定がされているかもしれません。親テーマの functions.php ファイルを確認し、wp_enqueue_script() を使用している部分を探してみてください。
    2. テーマファイル内での wp_enqueue_script をチェック 親テーマのどこかで wp_enqueue_script() を使用して files-list.js を読み込むような記述があるかもしれません。wp_enqueue_script('files-list', ...) のようなコードが見つかるはずです。
    3. プラグインや外部コードの影響 もしプラグインやカスタムコードが files-list.js を親テーマの js フォルダから読み込もうとしている場合もあるため、そのようなプラグインがないかも確認してみてください。

    もし親テーマのコードを確認した結果、それに関する部分が見つかれば、そのコードを削除するか修正することで問題を解決できます。

    Claude

    問題を発見しました!page-custom-files.php ファイルの中に、親テーマのディレクトリを参照しているコードがあります。

    問題のコード部分:

    // スクリプトとスタイルを登録する
    function enqueue_files_list_scripts() {
        // ファイル一覧表示用のスクリプトを登録
        wp_enqueue_script(
            'custom-files-list', 
            get_template_directory_uri() . '/js/files-list.js', 
            array('jquery'), 
            '1.0.0', 
            true
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'custom-files-list',
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    add_action('wp_enqueue_scripts', 'enqueue_files_list_scripts');
    

    ここでの問題点:

    1. get_template_directory_uri() は親テーマのディレクトリを参照します。これが http://www.anzai-home.com/wp/wp-content/themes/twentytwentyfive/js/files-list.js として読み込まれている原因です。
    2. さらに、ハンドル名も custom-files-listfiles-list で異なるため、両方のファイルが読み込まれようとしています。

    解決方法:

    1. page-custom-files.php 内のスクリプト読み込み部分を修正します。
    2. get_template_directory_uri()get_stylesheet_directory_uri() に変更して、子テーマのディレクトリを参照するようにします。
    3. もしくは、このスクリプト登録部分を削除して、すでに enqueue-scripts.php にある登録だけを使うようにします。

    以下のいずれかの対応を行ってください:

    1. page-custom-files.phpenqueue_files_list_scripts 関数を修正する:
    function enqueue_files_list_scripts() {
        // ファイル一覧表示用のスクリプトを登録
        wp_enqueue_script(
            'files-list', // 既存のハンドル名と合わせる
            get_stylesheet_directory_uri() . '/js/files-list.js', // 子テーマのディレクトリを参照
            array('jquery'), 
            '1.0.0', 
            true
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'files-list', // ハンドル名を合わせる
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    
    1. もしくは、page-custom-files.php からスクリプト登録部分を削除し、enqueue-scripts.phpenqueue_files_list_script 関数に nonce 部分を追加:
    function enqueue_files_list_script() {
        // ファイルパスを指定
        $script_path = get_stylesheet_directory() . '/js/files-list.js';
        // ファイルが存在するか確認し、更新時刻を取得
        if (file_exists($script_path)) {
            $script_version = filemtime($script_path);
        } else {
            $script_version = '1.0.0'; // ファイルが存在しない場合のデフォルトバージョン
            error_log($script_path);
        }
        // ファイルがテーマの js フォルダにある場合のパスを指定
        wp_enqueue_script(
            'files-list', // スクリプトのハンドル名
            get_stylesheet_directory_uri() . '/js/files-list.js', // スクリプトのパス
            array('jquery'), // jQueryに依存している場合、依存関係を指定
            $script_version, // バージョン番号
            true // フッターで読み込む
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'files-list',
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    

    これで問題が解決するはずです。親テーマからのファイル読み込みがなくなり、エラーが表示されなくなります。

  • VSC ショートカット

    VSC ショートカット

    Visual Studio Code (VSCode)の主なショートカットを一覧で表示します。

    基本操作

    ショートカット機能
    Ctrl + Pファイルをクイックオープン
    Ctrl + Shift + Pコマンドパレットを開く
    Ctrl + ,設定を開く
    Ctrl + KCtrl + Sキーボードショートカットを開く

    ファイル操作

    ショートカット機能
    Ctrl + N新しいファイルを作成
    Ctrl + Oファイルを開く
    Ctrl + Sファイルを保存
    Ctrl + Shift + S名前を付けて保存
    Ctrl + Wタブを閉じる
    Ctrl + KCtrl + Wすべてのタブを閉じる

    エディターの操作

    ショートカット機能
    Ctrl + X行を切り取り
    Ctrl + C行をコピー
    Ctrl + V貼り付け
    Ctrl + Z元に戻す
    Ctrl + Shift + Zやり直す
    Ctrl + D選択単語を次も選択
    Ctrl + L行全体を選択
    Ctrl + /コメントアウト(トグル)
    Alt + ↑ / ↓行を上/下に移動
    Shift + Alt + ↑ / ↓行をコピー
    Ctrl + Shift + K行を削除

    検索・置換

    ショートカット機能
    Ctrl + F検索
    Ctrl + H置換
    Ctrl + Shift + Fプロジェクト全体を検索
    Ctrl + Shift + Hプロジェクト全体を置換

    ナビゲーション

    ショートカット機能
    Ctrl + Tab最近使ったエディタ間を移動
    Ctrl + Shift + Tab逆順でエディタ間を移動
    Ctrl + ← / →単語単位で移動
    Ctrl + Home / Endファイルの先頭/末尾へ移動

    分割・ターミナル

    ショートカット機能
    Ctrl + \エディターを分割
    Ctrl + 1 / 2 / 3エディターグループを切り替え
    Ctrl + Shift +新しいターミナルを開く
    Ctrl + Shift + Cターミナルでコピー
    Ctrl + Shift + Vターミナルで貼り付け
    Ctrl + Jターミナルの表示/非表示

    デバッグ

    ショートカット機能
    F5デバッグの開始
    Shift + F5デバッグの停止
    F10ステップオーバー
    F11ステップイン
    Shift + F11ステップアウト
    Ctrl + Shift + F5再起動

    Git操作

    ショートカット機能
    Ctrl + Shift + Gソース管理を開く
    Ctrl + Enterコミット
    Ctrl + Shift + U差分を表示

    他にもカスタマイズ可能なショートカットがあります。Ctrl + Shift + Pで「キーボードショートカット」と検索すると、設定画面で変更できます。

  • メールデータ書出し用マクロ

    下記のコードをVBAエディターに張り付けてください。
    ※赤字の部分を使用者の名前に変更してください。

    以下のルールでメールを書き出します。

    • 会議招待メール → 自動で承諾し、削除
    • CC に使用者の名前が含まれ、本文の最初の数行にないメール
    • 宛先にユーザーの名前がないメール

    上記以外のメールは重要度が高いので書き出さない

    宛先がユーザーだけの場合は、広告メールの可能性があるので、確認して不要なアドレスは保存しておき削除リストにある場合はメールを削除

    Option Explicit
    
    ' Main procedure for email organization
    Sub メール整理Claud()
        Dim objNS As NameSpace
        Dim srcFolder As MAPIFolder
        Dim destFolder As MAPIFolder
        Dim plantFolder As MAPIFolder
        Dim saveDataFilename As String
        Dim eraseAddressList() As String
        Dim npointer As Long
        Dim eraseAddressFile As String
        Dim nameFilter As String
        Dim jsonData As String
        
        On Error GoTo ErrorHandler
        
        ' Configuration settings
        Const DEBUG_MODE As Boolean = False
        nameFilter = "Your Name"
        eraseAddressFile = "C:\Users\Public\Taro\Outlook File\er_address.txt"
        
        ' Validate that address file exists
        If Dir(eraseAddressFile) = "" Then
            MsgBox "アドレスファイルが見つかりません: " & eraseAddressFile, vbExclamation
            Exit Sub
        End If
    
        ' Initialize Outlook folders
        Set objNS = Application.GetNamespace("MAPI")
        Set srcFolder = objNS.GetDefaultFolder(olFolderInbox)
        
        ' Get destination folder from user
        Set destFolder = objNS.PickFolder
        If destFolder Is Nothing Then Exit Sub
        If destFolder.EntryID = srcFolder.EntryID Then
            MsgBox "送信元と同じフォルダが選択されました。", vbExclamation
            Exit Sub
        End If
        
        ' Get plant management folder
        On Error Resume Next
        Set plantFolder = srcFolder.Folders("プラント管理メール")
        On Error GoTo ErrorHandler
        
        If plantFolder Is Nothing Then
            MsgBox "プラント管理メール フォルダが見つかりません。フォルダを作成してください。", vbExclamation
            Exit Sub
        End If
    
        ' Get filename for JSON export
        saveDataFilename = GetSaveFilename()
        If saveDataFilename = "" Then
            MsgBox "終了します。", vbInformation
            GoTo Cleanup
        End If
    
        ' Load the address list for automatic deletion
        npointer = LoadAddressList(eraseAddressList, eraseAddressFile)
        If npointer < 0 Then GoTo Cleanup
    
        ' Process meeting requests
        ProcessMeetingRequests srcFolder
        
        ' Sort and process mail items
        Dim sortedItems() As mailItem
        Dim itemCount As Long
        itemCount = GetSortedMailItems(srcFolder, sortedItems)
        
        ' Process mail items and generate JSON
        jsonData = ProcessMailItems(sortedItems, itemCount, nameFilter, destFolder, plantFolder, _
                                  eraseAddressList, npointer, eraseAddressFile, DEBUG_MODE)
        
        ' Save JSON data to file
        SaveDataAsUTF8 jsonData, saveDataFilename
    
        MsgBox "終了しました。", vbOKOnly, "終了"
    
    Cleanup:
        Set objNS = Nothing
        Set srcFolder = Nothing
        Set destFolder = Nothing
        Set plantFolder = Nothing
        Exit Sub
    
    ErrorHandler:
        MsgBox "エラーが発生しました: " & Err.Description, vbCritical
        Resume Cleanup
    End Sub
    
    ' Process all mail items and generate JSON data
    Function ProcessMailItems(items() As mailItem, itemCount As Long, nameFilter As String, _
                             destFolder As MAPIFolder, plantFolder As MAPIFolder, _
                             ByRef eraseAddressList() As String, ByRef npointer As Long, _
                             eraseAddressFile As String, isDebug As Boolean) As String
        Dim mailItem As mailItem
        Dim recipientType As Integer
        Dim senderAddress As String
        Dim jsonArray As String
        Dim isFirstItem As Boolean
        Dim i As Long
        Dim result As Integer
        
        jsonArray = "["
        isFirstItem = True
        
        For i = 0 To itemCount - 1
            Set mailItem = items(i)
            recipientType = CheckRecipientType(mailItem, nameFilter)
            senderAddress = GetSenderAddress(mailItem)
            
            Select Case recipientType
                Case 7, 8  ' Plant management emails
                    If Not isDebug Then mailItem.Move plantFolder
                    
                Case 0  ' No recipients match filter
                    If Not isDebug Then mailItem.Move destFolder
                    
                Case 2  ' CC recipient and not in first 3 lines
                    If Not CheckNameInFirstLines(mailItem, nameFilter) Then
                        If Not isFirstItem Then jsonArray = jsonArray & ","
                        jsonArray = jsonArray & CreateMailItemJSON(mailItem)
                        isFirstItem = False
                        
                        If Not isDebug Then mailItem.Move destFolder
                    End If
                    
                Case 9  ' Only recipient and has sender address
                    If senderAddress <> "" Then
                        result = HandleSenderAddress(mailItem, eraseAddressList, npointer, eraseAddressFile)
                        If Not isDebug And result = 1 Then mailItem.Delete
                    End If
            End Select
        Next i
        
        jsonArray = jsonArray & "]"
        ProcessMailItems = jsonArray
    End Function
    
    ' Gets mail items from folder and sorts by received time (newest first)
    Function GetSortedMailItems(folder As MAPIFolder, ByRef items() As mailItem) As Long
        Dim allItems As items
        Dim item As Object
        Dim mailItem As mailItem
        Dim i As Long
        Dim count As Long
        
        ' First count the actual mail items
        count = 0
        For Each item In folder.items
            If TypeOf item Is mailItem Then count = count + 1
        Next
        
        If count = 0 Then
            GetSortedMailItems = 0
            Exit Function
        End If
        
        ' Dimension the array to exact size needed
        ReDim items(0 To count - 1) As mailItem
        
        ' Populate the array with mail items
        i = 0
        For Each item In folder.items
            If TypeOf item Is mailItem Then
                Set items(i) = item
                i = i + 1
            End If
        Next
        
        ' Use QuickSort on the array
        QuickSortMailItems items, 0, count - 1
        
        GetSortedMailItems = count
    End Function
    
    ' Optimized QuickSort algorithm for mail items (newest first)
    Sub QuickSortMailItems(ByRef items() As mailItem, ByVal low As Long, ByVal high As Long)
        Dim pivot As Date
        Dim i As Long, j As Long
        Dim tempItem As mailItem
        
        If low < high Then
            ' Use middle item as pivot to improve performance on already sorted data
            pivot = items((low + high) \ 2).ReceivedTime
            
            i = low
            j = high
            
            Do
                ' Find item on left that should be on right
                While items(i).ReceivedTime > pivot And i < high
                    i = i + 1
                Wend
                
                ' Find item on right that should be on left
                While pivot > items(j).ReceivedTime And j > low
                    j = j - 1
                Wend
                
                ' Swap the items
                If i <= j Then
                    Set tempItem = items(i)
                    Set items(i) = items(j)
                    Set items(j) = tempItem
                    i = i + 1
                    j = j - 1
                End If
            Loop Until i > j
            
            ' Recursively sort the sub-arrays
            If low < j Then QuickSortMailItems items, low, j
            If i < high Then QuickSortMailItems items, i, high
        End If
    End Sub
    
    ' Check recipient type and return appropriate code
    Function CheckRecipientType(mailItem As mailItem, nameFilter As String) As Integer
        Dim recipient As recipient
        Dim subject As String
        Dim sender As String
        
        subject = mailItem.subject
        sender = mailItem.senderName
        
        ' Check for plant management system emails
        If Left(subject, 10) = "プラント管理システム" Then
            CheckRecipientType = 8
            Exit Function
        End If
        
        If sender = "crepf-sys@nacoo.net" And Left(subject, 5) = "エラー発生" Then
            CheckRecipientType = 8
            Exit Function
        End If
        
        If Left(sender, 2) = "CC" And InStr(1, subject, "プラントデータ") <> 0 Then
            CheckRecipientType = 7
            Exit Function
        End If
        
        ' Check recipients
        For Each recipient In mailItem.recipients
            If InStr(recipient.Name, nameFilter) <> 0 Then
                If mailItem.recipients.count = 1 Then
                    CheckRecipientType = 9 ' Only recipient
                Else
                    CheckRecipientType = recipient.Type ' Type: BCC=3, CC=2, TO=1, Originator=0
                End If
                Exit Function
            End If
        Next
        
        CheckRecipientType = 0 ' No matching recipients
    End Function
    
    ' Get sender's email address
    Function GetSenderAddress(mailItem As mailItem) As String
        If mailItem.SenderEmailType = "EX" Then
            GetSenderAddress = ""
        Else
            GetSenderAddress = mailItem.SenderEmailAddress
        End If
    End Function
    
    ' Check if name appears in first few lines of email body
    Function CheckNameInFirstLines(mailItem As mailItem, nameFilter As String) As Boolean
        Dim topLines As String
        
        ' Get top lines of body (6 rows to account for HTML formatting)
        topLines = GetTopLines(mailItem.body, 6, mailItem.BodyFormat)
        
        CheckNameInFirstLines = (InStr(topLines, nameFilter) <> 0)
    End Function
    
    ' Get the top N lines of text
    Function GetTopLines(text As String, lineCount As Integer, format As OlBodyFormat) As String
        Dim lineBreak As String
        Dim position As Long
        Dim nextPosition As Long
        Dim i As Integer
        Dim result As String
        
        ' Determine line break character based on format
        If format = olFormatHTML Then
            lineBreak = vbCrLf
        Else
            lineBreak = vbLf
        End If
        
        position = 1
        result = ""
        
        For i = 1 To lineCount
            nextPosition = InStr(position, text, lineBreak, vbBinaryCompare)
            
            If nextPosition = 0 Then
                ' No more line breaks, include rest of text
                result = result & Mid(text, position)
                Exit For
            Else
                ' Add current line to result
                result = result & Mid(text, position, nextPosition - position + Len(lineBreak))
                position = nextPosition + Len(lineBreak)
            End If
        Next i
        
        GetTopLines = result
    End Function
    
    ' Process meeting requests automatically
    Sub ProcessMeetingRequests(folder As MAPIFolder)
        Dim item As Object
        Dim meetingItem As meetingItem
        Dim appointment As AppointmentItem
        
        On Error Resume Next
        
        For Each item In folder.items
            If TypeOf item Is meetingItem Then
                Set meetingItem = item
                Set appointment = meetingItem.GetAssociatedAppointment(True)
                
                If Not appointment Is Nothing Then
                    appointment.Respond olResponseAccepted, True
                    meetingItem.Delete
                End If
            End If
        Next
        
        On Error GoTo 0
    End Sub
    
    ' Handle sender address processing
    Function HandleSenderAddress(mailItem As mailItem, ByRef eraseAddressList() As String, _
                                ByRef npointer As Long, eraseAddressFile As String) As Integer
        Dim result As Integer
        Dim senderAddress As String
        Dim addressStatus As Integer
        
        senderAddress = mailItem.SenderEmailAddress
        addressStatus = CheckAddressInList(senderAddress, eraseAddressList)
        
        Select Case addressStatus
            Case 0 ' Delete
                HandleSenderAddress = 1
                
            Case 9 ' Not in list, ask user
                result = InquireAboutAddress(mailItem)
                
                ' Ensure array has enough space
                If UBound(eraseAddressList, 2) < npointer Then
                    ReDim Preserve eraseAddressList(0 To 1, 0 To npointer + 10)
                End If
                
                If result = vbYes Then ' Delete
                    eraseAddressList(0, npointer) = senderAddress
                    eraseAddressList(1, npointer) = 0
                    npointer = npointer + 1
                    SaveAddressToFile senderAddress, 0, eraseAddressFile
                    HandleSenderAddress = 1
                ElseIf result = vbNo Then ' Keep
                    eraseAddressList(0, npointer) = senderAddress
                    eraseAddressList(1, npointer) = 1
                    npointer = npointer + 1
                    SaveAddressToFile senderAddress, 1, eraseAddressFile
                    HandleSenderAddress = 0
                End If
                
            Case Else ' Keep
                HandleSenderAddress = 0
        End Select
    End Function
    
    ' Check if address exists in deletion list
    Function CheckAddressInList(address As String, ByRef addressList() As String) As Integer
        Dim i As Long
        
        If Not IsArrayInitialized(addressList) Then
            CheckAddressInList = 9 ' Not in list
            Exit Function
        End If
        
        For i = 0 To UBound(addressList, 2)
            If addressList(0, i) = address Then
                CheckAddressInList = addressList(1, i) ' Return status (0=delete, 1=keep)
                Exit Function
            End If
        Next
        
        CheckAddressInList = 9 ' Not in list
    End Function
    
    ' Load address list from file
    Function LoadAddressList(ByRef addressList() As String, filename As String) As Long
        Dim fileNumber As Integer
        Dim address As String
        Dim flag As String
        Dim i As Long
        
        On Error GoTo ErrorHandler
        
        ' Initialize array
        ReDim addressList(0 To 1, 0 To 10)
        
        ' Check if file exists
        If Dir(filename) = "" Then
            LoadAddressList = 0
            Exit Function
        End If
        
        ' Open file
        fileNumber = FreeFile
        Open filename For Input As #fileNumber
        
        i = 0
        Do Until EOF(fileNumber)
            ' Read address and flag
            Input #fileNumber, address, flag
            
            ' Resize array if needed
            If i > UBound(addressList, 2) Then
                ReDim Preserve addressList(0 To 1, 0 To i + 10)
            End If
            
            ' Store values
            addressList(0, i) = address
            addressList(1, i) = Val(flag)
            i = i + 1
        Loop
        
        Close #fileNumber
        LoadAddressList = i
        Exit Function
        
    ErrorHandler:
        MsgBox "アドレスリストの読み込み中にエラーが発生しました: " & Err.Description, vbCritical
        If fileNumber > 0 Then Close #fileNumber
        LoadAddressList = -1
    End Function
    
    ' Save address and flag to file
    Sub SaveAddressToFile(address As String, flag As Integer, filename As String)
        Dim fileNumber As Integer
        
        On Error Resume Next
        fileNumber = FreeFile
        Open filename For Append As #fileNumber
        
        Write #fileNumber, address, flag
        
        Close #fileNumber
    End Sub
    
    ' Show dialog to ask about address
    Function InquireAboutAddress(mailItem As mailItem) As Integer
        Dim senderName As String
        Dim senderAddress As String
        Dim subject As String
        
        senderName = mailItem.senderName
        senderAddress = mailItem.SenderEmailAddress
        subject = mailItem.subject
        
        Load InqDlg
        InqDlg.StartUpPosition = 1
        InqDlg.Caption = "削除リストに追加しますか?"
        InqDlg.Label_sender.Caption = senderName
        InqDlg.Label_adress = senderAddress
        InqDlg.Label_subject = subject
        
        InqDlg.Show
        InquireAboutAddress = InqDlg.DialogResult
    End Function
    
    ' Create JSON representation of mail item
    Function CreateMailItemJSON(mailItem As mailItem) As String
        Dim json As String
        Dim toRecipients As String
        Dim ccRecipients As String
        Dim bccRecipients As String
        Dim attachments As String
        Dim recipient As Outlook.recipient
        Dim attachment As Outlook.attachment
        Dim bodyText As String
        
        ' Process To recipients
        toRecipients = "["
        For Each recipient In mailItem.recipients
            If recipient.Type = olTo Then
                If toRecipients <> "[" Then toRecipients = toRecipients & "," & vbCrLf & vbTab & vbTab
                toRecipients = toRecipients & """" & recipient.Name & """"
            End If
        Next recipient
        If Len(toRecipients) > 1 Then toRecipients = toRecipients & vbCrLf & vbTab
        toRecipients = toRecipients & "]"
        
        ' Process CC recipients
        ccRecipients = "["
        For Each recipient In mailItem.recipients
            If recipient.Type = olCC Then
                If ccRecipients <> "[" Then ccRecipients = ccRecipients & "," & vbCrLf & vbTab & vbTab
                ccRecipients = ccRecipients & """" & recipient.Name & """"
            End If
        Next recipient
        If Len(ccRecipients) > 1 Then ccRecipients = ccRecipients & vbCrLf & vbTab
        ccRecipients = ccRecipients & "]"
        
        ' Process BCC recipients
        bccRecipients = "["
        For Each recipient In mailItem.recipients
            If recipient.Type = olBCC Then
                If bccRecipients <> "[" Then bccRecipients = bccRecipients & "," & vbCrLf & vbTab & vbTab
                bccRecipients = bccRecipients & """" & recipient.Name & """"
            End If
        Next recipient
        If Len(bccRecipients) > 1 Then bccRecipients = bccRecipients & vbCrLf & vbTab
        bccRecipients = bccRecipients & "]"
        
        ' Process attachments
        attachments = "["
        For Each attachment In mailItem.attachments
            If attachments <> "[" Then attachments = attachments & "," & vbCrLf & vbTab & vbTab
            attachments = attachments & """" & EscapeJSON(attachment.filename) & """"
        Next attachment
        If Len(attachments) > 1 Then attachments = attachments & vbCrLf & vbTab
        attachments = attachments & "]"
        
        ' Process body (truncate if too long)
        bodyText = TruncateLongEmail(mailItem.body)
        
        ' Build JSON structure
        json = "{" & vbCrLf
        json = json & vbTab & """ReceivedTime"": """ & format(mailItem.ReceivedTime, "yyyy-mm-dd hh:nn:ss") & """," & vbCrLf
        json = json & vbTab & """SenderName"": """ & EscapeJSON(mailItem.senderName) & """," & vbCrLf
        json = json & vbTab & """Subject"": """ & EscapeJSON(mailItem.subject) & """," & vbCrLf
        json = json & vbTab & """To"": " & toRecipients & "," & vbCrLf
        json = json & vbTab & """CC"": " & ccRecipients & "," & vbCrLf
        json = json & vbTab & """BCC"": " & bccRecipients & "," & vbCrLf
        json = json & vbTab & """Attachments"": " & attachments & "," & vbCrLf
        json = json & vbTab & """Body"": """ & EscapeJSON(bodyText) & """" & vbCrLf
        json = json & "}"
        
        CreateMailItemJSON = json
    End Function
    
    ' Truncate long emails to a reasonable size
    Function TruncateLongEmail(emailBody As String) As String
        Const MAX_LENGTH As Long = 10000
        Dim result As String
        Dim position As Long
        Dim nextMatchPos As Long
        
        ' If email is already within limit, return as is
        If Len(emailBody) <= MAX_LENGTH Then
            TruncateLongEmail = emailBody
            Exit Function
        End If
        
        ' Start building truncated content
        result = ""
        position = 1
        
        Do While position > 0
            ' Find next matching line position
            nextMatchPos = FindFirstMatchingLine(emailBody, position)
            
            ' If no more matching lines are found, append the remaining text
            If nextMatchPos = 0 Then
                If Len(result & Mid(emailBody, position)) > MAX_LENGTH Then
                    Exit Do
                End If
                result = result & Mid(emailBody, position)
                Exit Do
            End If
            
            ' Append text up to the matching position
            If Len(result & Mid(emailBody, position, nextMatchPos - position)) > MAX_LENGTH Then
                Exit Do
            End If
            result = result & Mid(emailBody, position, nextMatchPos - position)
            
            ' Update position to continue after the match
            position = InStr(nextMatchPos, emailBody, vbCrLf)
            If position = 0 Then
                Exit Do
            Else
                position = position + 2
            End If
        Loop
        
        TruncateLongEmail = result
    End Function
    
    ' Find email format patterns like reply headers
    Function FindFirstMatchingLine(text As String, Optional startPos As Long = 1) As Long
        Dim regEx As Object
        Dim matches As Object
        Dim searchText As String
        
        ' Adjust starting position
        If startPos < 1 Then startPos = 1
        If startPos > Len(text) Then
            FindFirstMatchingLine = 0
            Exit Function
        End If
        
        ' Create regex object
        Set regEx = CreateObject("VBScript.RegExp")
        regEx.Pattern = "(\d{4}年\d{1,2}月\d{1,2}日\(.\) \d{1,2}:\d{2} .+ <.+@.+\..+>:" & _
                       "|差出人: .+ <.+@.+\..+>" & _
                       "|-+ Original Message -+\nFrom : \"".+\""<.+@.+\..+>)"
        regEx.IgnoreCase = True
        regEx.Global = False
        
        ' Get substring from starting position
        searchText = Mid(text, startPos)
        
        ' Execute regex
        Set matches = regEx.Execute(searchText)
        
        ' Return match position if found
        If matches.count > 0 Then
            FindFirstMatchingLine = startPos + matches(0).FirstIndex - 1
        Else
            FindFirstMatchingLine = 0
        End If
    End Function
    
    ' Escape special characters for JSON output
    Function EscapeJSON(text As String) As String
        Dim result As String
        
        result = text
        result = Replace(result, "\", "\\")
        result = Replace(result, """", "\""")
        result = Replace(result, vbCrLf, "\n")
        result = Replace(result, vbLf, "\n")
        result = Replace(result, vbCr, "\n")
        result = Replace(result, vbTab, " ")
        
        ' Remove control characters
        result = RemoveControlCharacters(result)
        
        EscapeJSON = result
    End Function
    
    ' Remove control characters from text
    Function RemoveControlCharacters(text As String) As String
        Dim i As Long
        Dim charCode As Integer
        Dim result As String
        
        result = ""
        For i = 1 To Len(text)
            charCode = Asc(Mid(text, i, 1))
            ' Skip control characters (ASCII 0-31, 127)
            If charCode >= 32 And charCode <> 127 Then
                result = result & Mid(text, i, 1)
            End If
        Next i
        
        RemoveControlCharacters = result
    End Function
    
    ' Get save filename with date-based naming
    Function GetSaveFilename() As String
        Dim xlApp As Object
        Dim fileDialog As Object
        Dim selectedFolder As String
        
        ' Create Excel application to use FileDialog
        Set xlApp = CreateObject("Excel.Application")
        Set fileDialog = xlApp.fileDialog(msoFileDialogFolderPicker)
        
        With fileDialog
            .Title = "メールデータの保存先フォルダを選択してください"
            
            If .Show = -1 Then
                selectedFolder = .SelectedItems(1)
            Else
                GetSaveFilename = ""
                Set fileDialog = Nothing
                xlApp.Quit
                Set xlApp = Nothing
                Exit Function
            End If
        End With
        
        ' Create date-based filename
        GetSaveFilename = CreateDatedFilename(selectedFolder, "maildata", "json")
        
        ' Clean up
        Set fileDialog = Nothing
        xlApp.Quit
        Set xlApp = Nothing
    End Function
    
    ' Create dated filename with increment for existing files
    Function CreateDatedFilename(folderPath As String, prefix As String, extension As String) As String
        Dim filePath As String
        Dim i As Long
        Dim today As Date
        
        today = Date
        i = 0
        
        Do
            ' Format: prefix + YYMMDD + sequential number + extension
            filePath = folderPath & "\" & prefix & format(today, "yymmdd") & format(i, "000") & "." & extension
            
            ' Check if file exists
            If Dir(filePath) = "" Then
                Exit Do
            End If
            
            i = i + 1
        Loop
        
        CreateDatedFilename = filePath
    End Function
    
    ' Save data to file with UTF-8 encoding (no BOM)
    Sub SaveDataAsUTF8(data As String, filename As String)
        Dim stream As Object
        
        On Error GoTo ErrorHandler
        
        ' Create ADODB Stream object
        Set stream = CreateObject("ADODB.Stream")
        
        With stream
            .Charset = "UTF-8"
            .Type = 2 ' Text mode
            .Open
            .WriteText data
            
            ' Remove BOM
            .position = 0
            .Type = 1 ' Binary mode
            .position = 3 ' Skip BOM bytes
            
            Dim byteData() As Byte
            byteData = .Read
            .Close
            
            ' Write data without BOM
            .Open
            .Write byteData
            .SaveToFile filename, 2 ' ForOverwrite
            .Close
        End With
        
        Set stream = Nothing
        Exit Sub
        
    ErrorHandler:
        MsgBox "ファイル保存中にエラーが発生しました: " & Err.Description, vbCritical
        If Not stream Is Nothing Then
            On Error Resume Next
            stream.Close
            Set stream = Nothing
        End If
    End Sub
    
    ' Check if array is initialized
    Function IsArrayInitialized(arr As Variant) As Boolean
        On Error Resume Next
        IsArrayInitialized = IsArray(arr) And Not IsError(LBound(arr, 1))
        On Error GoTo 0
    End Function
    
    
  • メール要約

    Mail Summarize
    Outlookのマクロで書き出したデータファイル(JSON形式)をドラックアンドドロップすると、AIにより件名ごとに要約します。
    (Outlook用マクロ http://www.anzai-home.com/wp/?p=137

    要約はデータとして保存しますので、あとから見返すことができます。

    JSON形式


    1. メールの基本情報

    • ReceivedTime: メールを受信した日時(例: "2024/12/09 10:00:00"
    • SenderName: 送信者の名前(例: "Taro Tanaka"
    • Subject: メールの件名(例: "Re: Product Defect Inquiry"

    2. 宛先情報

    • To: 宛先のリスト(例: ["Hiroshi Yamamoto", "Mika Suzuki"]
    • CC: CC(カーボンコピー)のリスト(例: ["Tetsuya Kato", "Kenji Nakamura", "Rika Fujimoto"]
    • BCC: BCC(ブラインドカーボンコピー)のリスト(例: [] ※BCCなし)

    3. 添付ファイル情報

    • Attachments: 添付ファイルのリスト(例: ["Project_Schedule.xlsx"]

    4. メール本文

    Body: メールの内容

    例:

    [
        {
            "ReceivedTime": "2024/12/09 10:00:00",
            "SenderName": "Taro Tanaka",
            "Subject": "Re: Product Defect Inquiry",
            "To": ["Hiroshi Yamamoto", "Mika Suzuki"],
            "CC": ["Tetsuya Kato", "Kenji Nakamura", "Rika Fujimoto"],
            "BCC": [],
            "Attachments": [],
            "Body": "Dear Yamamoto-san,\n\nThank you for your inquiry.\nWe have checked the defective product and will send a replacement shortly.\nPlease let us know if you need any further assistance.\n\nBest regards,\nTanaka"
        },
        {
            "ReceivedTime": "2024/12/09 09:30:00",
            "SenderName": "Keiko Saito",
            "Subject": "Re: Project Schedule Update",
            "To": ["yamada.taro@example.com"],
            "CC": ["info@example.com", "takashi.abe@example.com"],
            "BCC": [],
            "Attachments": ["Project_Schedule.xlsx"],
            "Body": "Dear Yamada-san,\n\nWe have updated the project schedule.\nPlease find the attached file for details.\n\nBest regards,\nSaito"
        }
    ]