💬

Google Chatの入力欄にメッセージを設定するUserScript

2023/10/14に公開

目的

Google Chatの入力欄に指定したメッセージを設定すること。
(投稿日時点では他のメッセージをコピーしてそのまま貼り付けると、謎の改行が入ってしまう現象が発生する…)

実装

ボタンの付け所に迷ったので、UserScript+ブックマークレットで実装しました。

UserScriptの内容

// ==UserScript==
// @name         Google Chat 文字列設定
// @namespace    https://chat.google.com/
// @version      1.0.0
// @description  Google Chatのテキストボックスに文字列を設定します
// @author       You
// @match        https://chat.google.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=google.com
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  // メッセージを受け取って実行する
  window.addEventListener('message', e => {
    if (e.origin === 'https://mail.google.com') {
      setMessage(e.data);
    }
  });

  /**
   * 入力内容を設定
   * @param {string} text 入力内容
   */
  function setMessage(text)
  {
    const $textbox = document.querySelector('[role="textbox"][contenteditable="true"]');
    if (!$textbox) {
      return;
    }

    // 内容を削除
    while ($textbox.firstChild) {
      $textbox.removeChild($textbox.firstChild);
    }

    // 内容を設定
    text.split('\n').forEach(line => {
      const $div = document.createElement('div');
      $div.textContent = line;

      $textbox.append($div);
    });

    // カーソル位置移動
    const selection = window.getSelection();
    const range = document.createRange();
    range.setStartAfter($textbox.lastChild);
    range.setEndAfter($textbox.lastChild);
    selection.removeAllRanges();
    selection.addRange(range);
  }
})();

ブックマークレットの内容

javascript:(() => {
  if (location.origin !== 'https://mail.google.com') {
    return;
  }

  const $iframes = document.querySelectorAll('iframe[src^="https://chat.google.com/u/0/frame"]');
  const iframeArr = Array.from($iframes).filter($e => $e.parentElement.style.display !== 'none');

  /* 読み込み時に開いているもの */
  let $iframe = iframeArr.find($e => $e.src.includes('id=hostFrame'));
  if (! $iframe) {
    /* 選択して開いたもの */
    $iframe = iframeArr.find($e => $e.src.includes('id=spareFrame'));
  }

  if ($iframe) {
    $iframe.contentWindow.postMessage('設定したいメッセージ', 'https://chat.google.com');
  }
})();

後書き

可能なら自動送信までやりたかったものの、方法がわかりませんでした。
もし知っている方がいたら教えていただきたいです。

Discussion