Gmailのパーマリンク取得
by
Lhankor_Mhy
12/01 [2025/12/01 14:19:34]
メールを開いてブックマークレットを使ってからページをクリックすると、メールのパーマリンクをクリップボードにコピーします。
@@ -1,36 +1,33 @@
/*
* @title Gmailのパーマリンク取得
- * @description ブックマークレットを使ってからメールスレッドやタイトルなどをクリックしてください
+ * @description メールを開いてブックマークレットを使ってからページをクリックすると、メールのパーマリンクをクリップボードにコピーします。
* @include https://mail.google.com/
* @license CC0
* @javascript_url
*/
-{
- const targetDataAttributeNames = [
- "data-legacy-last-message-id",
- "data-legacy-message-id",
- "data-legacy-thread-id",
- ]
-
- alert('パーマリンクを取得するメールをクリック')
- console.log('test')
- document.documentElement.addEventListener('click', e => {
- const target = e.target;
- let id;
- for (const targetDataAttribute of targetDataAttributeNames) {
- if (target.getAttributeNames().includes(targetDataAttribute)) {
- id = target.getAttribute(targetDataAttribute);
- break;
- }
- if (target.closest(`[${targetDataAttribute}]`)) {
- id = target.closest(`[${targetDataAttribute}]`).getAttribute(targetDataAttribute);
- break;
- }
+(async () => {
+ const targetDataAttributeName = "data-thread-perm-id"
+ const waitForEvent = (eventTarget, eventType) => new Promise((resolve, reject) =>
+ eventTarget.addEventListener(eventType, resolve, { once: true, signal: AbortSignal.timeout(10000) })
+ )
+
+ await waitForEvent(document, 'mousedown')
+
+ const targetElement = document.querySelector(`[${targetDataAttributeName}]`)
+ if (!targetElement) {
+ alert("メールを開いてからブックマークレットを使ってください")
+ return
}
+ const threadId = targetElement?.getAttribute(targetDataAttributeName)
+
+ navigator.clipboard.writeText(`https://mail.google.com/mail/u/0/#all/${encodeURIComponent(threadId)}`)
+ .then(() => alert("メールのパーマリンクをクリップボードにコピーしました"))
+ .catch(err => {
+ console.error("クリップボードへのコピーに失敗しました", err)
+ alert("クリップボードへのコピーに失敗しました")
+ });
- prompt('パーマリンク', `https://mail.google.com/mail/u/0/#all/${id}`)
+})()
- }, { once: true })
-}
/*
* @title Gmailのパーマリンク取得
* @description メールを開いてブックマークレットを使ってからページをクリックすると、メールのパーマリンクをクリップボードにコピーします。
* @include https://mail.google.com/
* @license CC0
* @javascript_url
*/
(async () => {
const targetDataAttributeName = "data-thread-perm-id"
const waitForEvent = (eventTarget, eventType) => new Promise((resolve, reject) =>
eventTarget.addEventListener(eventType, resolve, { once: true, signal: AbortSignal.timeout(10000) })
)
await waitForEvent(document, 'mousedown')
const targetElement = document.querySelector(`[${targetDataAttributeName}]`)
if (!targetElement) {
alert("メールを開いてからブックマークレットを使ってください")
return
}
const threadId = targetElement?.getAttribute(targetDataAttributeName)
navigator.clipboard.writeText(`https://mail.google.com/mail/u/0/#all/${encodeURIComponent(threadId)}`)
.then(() => alert("メールのパーマリンクをクリップボードにコピーしました"))
.catch(err => {
console.error("クリップボードへのコピーに失敗しました", err)
alert("クリップボードへのコピーに失敗しました")
});
})()
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。