tokumeitokumei
@tokumeitokumei (匿名)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Chrome拡張機能で作ったチェックボックスを押して、ChatGPTのテキストエリアに入力を行いたい

解決したいこと

Chrome拡張機能を作りました。
ChatGPTのページ内にチェックボックスを追加し、そのチェックボックスをONにすることでテキストエリアにContent.JS内で設定しておいた文字列が入力されるというものです。

しかし、チェックボックスを押しても、文章は打ち込まれません。

解決策、あるいはテキスト入力が行える何かしらの別策をいただきたいです。

発生している問題・エラー

以下の画像は自作の拡張機能をONにした状態のChatGPTのサイトの画面です。
右上にONにしてある青いチェックボックスがあります。これが拡張機能で追加したものです。

これをONにして画面中央の入力欄に”チェック”と入力が行われるようにしたいのですが、それができません。

スクリーンショット 2024-11-02 185515.png

拡張機能のコードと仕様

コードを2つ載せます。
まず、短くわかりやすいほうを置きます。

content.js

// チェックボックスを置くdivの作成
const toggleDiv = document.createElement("div");
toggleDiv.id = "floatingDiv";
// divの装飾
toggleDiv.style.position = "fixed";//GPTと干渉しないようにする
toggleDiv.style.display = "flex";
toggleDiv.style.top = "0px";//GPTに合わせる
toggleDiv.style.right = "12%";
toggleDiv.style.width = "50px";
toggleDiv.style.height = "56px";//GPTに合わせる
toggleDiv.style.backgroundColor = "rgba(255, 255, 255)";//GPTに合わせる
toggleDiv.style.color = "#5D5D5D";//GPTに合わせる
toggleDiv.style.padding = "12px";//GPTに合わせる
toggleDiv.style.borderRadius = "5rem";//GPTに合わせる
toggleDiv.style.alignItems = "center";//GPTに合わせる
toggleDiv.style.zIndex = "1000"; // 他の要素より前面に表示

// チェックボックスをinnerHTMLで作成
toggleDiv.innerHTML = `
  <input type="checkbox" id="toggleSwitch" />
  <label for="toggleSwitch" style="cursor: pointer;"></label>
`;

// チェックボックスをクリックしたら入力を行う
toggleDiv.querySelector("#toggleSwitch").addEventListener("change", (event) => {
    if (event.target.checked) {
        // ChatGPTの入力欄を特定し、「チェック」と入力する
        const inputField = document.getElementById("prompt-textarea") || document.querySelector(".ProseMirror"); // idまたはclassで取得
        if (inputField) {
            inputField.value = "チェック"; // 入力欄に値を設定
            inputField.dispatchEvent(new Event("input", { bubbles: true })); // 入力イベントを発火
        }
    }
});
}

// divをページに追加
document.body.appendChild(toggleDiv);

自分で試したこと

まず、テキストエリアのidは"prompt-textarea"で、classは"ProseMirror"です。
これは間違いないと考えられます。

なぜなら以下のコードの防御的プログラミング内で確認ができるからです。

// 浮かせるdiv要素を作成
const toggleDiv = document.createElement("div");
toggleDiv.id = "floatingDiv";
toggleDiv.style.position = "fixed";//GPTと干渉しないようにする
toggleDiv.style.display = "flex";
toggleDiv.style.top = "0px";//GPTに合わせる
toggleDiv.style.right = "12%";
toggleDiv.style.width = "50px";
toggleDiv.style.height = "56px";//GPTに合わせる
toggleDiv.style.backgroundColor = "rgba(255, 255, 255)";//GPTに合わせる
toggleDiv.style.color = "#5D5D5D";//GPTに合わせる
toggleDiv.style.padding = "12px";//GPTに合わせる
toggleDiv.style.borderRadius = "5rem";//GPTに合わせる
toggleDiv.style.alignItems = "center";//GPTに合わせる
toggleDiv.style.zIndex = "1000"; // 他の要素より前面に表示

// トグルスイッチをinnerHTMLで追加
toggleDiv.innerHTML = `
  <input type="checkbox" id="toggleSwitch" />
  <label for="toggleSwitch" style="cursor: pointer;"></label>
`;

// チェックボックスのクリックイベントを追加
const toggleSwitch = toggleDiv.querySelector("#toggleSwitch");
if (toggleSwitch) {
    toggleSwitch.addEventListener("change", (event) => {
        try {
            if (event && event.target && typeof event.target.checked !== "undefined") {
                // チェック状態が取得できる場合
                if (event.target.checked) {
                    console.log("チェックボックスがオンになりました。入力欄を探しています...");

                    // ChatGPTの入力欄を特定
                    const inputField = document.getElementById("prompt-textarea") || document.querySelector(".ProseMirror");

                    if (inputField) {
                        console.log("入力欄が見つかりました。テキストを入力します...");

                        // フォーカスを設定し、既存の内容をクリア
                        inputField.focus();
                        inputField.value = ""; // 既存のテキストをクリア

                        // 値を設定し、Reactが認識するようにイベントを発火
                        inputField.value = "チェック";
                        inputField.dispatchEvent(new Event("input", { bubbles: true }));
                    } else {
                        console.log("入力欄が見つかりませんでした。idやclassが正しいか確認してください。");
                    }
                } else {
                    console.log("チェックボックスがオフになりました。");
                }
            } else {
                console.error("チェック状態の取得に失敗しました。イベントオブジェクトを確認してください。");
            }
        } catch (error) {
            console.error("エラーが発生しました:", error);
        }
    });
} else {
    console.error("チェックボックスが見つかりませんでした。トグルスイッチのIDが正しいか確認してください。");
}

// divをページに追加
document.body.appendChild(toggleDiv);

このコードで、
・チェックボックスがオンになりました。入力欄を探しています...
・入力欄が見つかりました。テキストを入力して変更を監視します...
・チェックボックスがオフになりました。
の3つの出力をChromeのデベロッパーツールのConsoleで確認できます。

また、このコードであれば、チェックボックスを押した後、テキストエリアが入力待機状態になります。
(入力欄をクリックしたときに棒がちかちかなるやつ)
先ほどの短いコードではなりませんでした。

以上、私にはこれ以上がわかりません。なにとぞご教授いただければと思います。よろしくお願いします。

0

1Answer

#prompt-textareaにはuser-modifyというCSSプロパティがあり、普通の要素に入力機能を持たせます(スプレッドシートなとで見かけます)。

つまり普通の要素(フォーム関連では無い)なのでvalueプロパティはありません。素直にinnerTextプロパティに代入してください。

0Like

Comments

  1. @tokumeitokumei

    Questioner

    つまりアプローチが初めから間違っていたのですね。こういうやり方があったのか...
    いい勉強になりました。ありがとうございました。

Your answer might help someone💌