【Salesforce自動操作 第1回】右クリックメニューの追加【vba, chrome拡張機能】

目次

前回のおさらい

第0回はソースを記述していないので、おさらいすることはありません。

今回やること

時系列順に実装するのであれば、VBAからChromeへ値を渡す処理からですが、毎回値渡しをしていては動作確認に時間がかかってしまいます。また、値渡しはSalesforceのめんどく変わった仕様から一筋縄ではいきません。最後に回します。

とりあえずは、仮組としてChrome拡張機能を使って、右クリックメニューから直接Salesforceを参照する処理を記述します。

ソースコード 全体


{
  "manifest_version": 3
    , "version": "1.0"
    , "name": "SalesforceAutoRegist"
    , "description": "Salesforce自動登録 1回目"

    , "background": {
        "service_worker":"background.js"
    }
    , "permissions": [
        "activeTab",
        "scripting",
        "contextMenus"
    ]
}

/**
 * インストールイベント
 */
chrome.runtime.onInstalled.addListener(function() {
    const menu = chrome.contextMenus.create({
        type: "normal"
        , id: "contextmenu1"
        , title: "右クリックメニュー"
    });
});

/**
 * 右クリックメニュー選択イベント
 */
chrome.contextMenus.onClicked.addListener((info, tab) => {
    chrome.scripting.executeScript({
        target: { tabId: tab.id },
        files: ["contentsScript.js"]
      });
});
function main() {
    alert(document.title);
}
main();

解説

permissions

chrome拡張機能のメソッドを利用する場合、あらかじめpermissionsを指定しておく必要があります。Cでいう<#include>、Javaでいうusingのようなものです。

chrome拡張機能のリファレンスに必要なpermissionsが記載されています。

    , "permissions": [
        "activeTab",
        "scripting",
        "contextMenus"
    ]
    chrome.scripting.executeScript({
        target: { tabId: tab.id },
        files: ["contentsScript.js"]
    });
chrome.contextMenus.onClicked.addListener((info, tab) => {...}
  • activeTab : 特定のタブに対して処理をする場合に必要
  • scripting : chrome.scripting から始まるメソッドを使う場合に必要
  • contextMenus: chrome.contextMenus から始まるメソッドを使う場合に必要

addListener

chrome.runtime.onInstalled.addListener

拡張機能を読み込んだタイミング、または拡張機能が更新されたタイミングで呼び出されます。

ここで、右クリック時のメニューを追加しています。

chrome.contextMenus.onClicked.addListener

右クリックメニューが選択されたタイミングで呼び出されます。

chrome.scripting.executeScriptによって別のjsファイルを実行することができます。

動作

chrome拡張機能を読み込むと右クリックメニューに「右クリックメニュー」の欄が追加されました。(名前が安直すぎたかもしれませんが)

また、Salesforceのケース作成で右クリックメニューを選択すると、ブラウザのタイトル名がalertで表示されました。

 

はまりやすいポイント

executeScriptingの実行

chrome.scripting.executeScriptではfilesを指定していますが、funcというパラメータでBackground.js内で定義したメソッドを呼び出すことも可能です。

しかし、background.jsからはDOM参照できないという制約があるため、スクレイピングをしたいのであればfilesでの指定が必要になります。

   chrome.scripting.executeScript({
        target: { tabId: tab.id },
        func: testMethod
    });
// (中略)
function testMethod() {
    alert(document.title);
}