{"id":136,"date":"2026-04-02T08:00:00","date_gmt":"2026-04-01T23:00:00","guid":{"rendered":"https:\/\/classlab.co.jp\/engineer\/blog\/chrome-extension-cx-operations-2\/"},"modified":"2026-04-02T08:00:00","modified_gmt":"2026-04-01T23:00:00","slug":"chrome-extension-cx-operations-2","status":"publish","type":"post","link":"https:\/\/classlab.co.jp\/engineer\/blog\/chrome-extension-cx-operations-2\/","title":{"rendered":"Chrome\u62e1\u5f356\u30e2\u30b8\u30e5\u30fc\u30eb\u3067SF\u696d\u52d9\u3092\u52b9\u7387\u5316\u3057\u305f\u8a71"},"content":{"rendered":"<blockquote>\n<p>ClassLab Engineering \u306e Dev \u30c1\u30fc\u30e0\u30e1\u30f3\u30d0\u30fc\u304c\u57f7\u7b46\u3057\u307e\u3057\u305f\u3002<\/p>\n<\/blockquote>\n<p>\u300cSalesforce\u3067\u306e\u5165\u529b\u4f5c\u696d\u3001\u306a\u3093\u3068\u304b\u306a\u3089\u306a\u3044\uff1f\u300d\u2014\u2014\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u306e\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304b\u3089\u6bce\u9031\u306e\u3088\u3046\u306b\u805e\u3053\u3048\u3066\u304f\u308b\u58f0\u3067\u3057\u305f\u3002<\/p>\n<p>ClassLab\u306e\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u3067\u306f\u3001\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304c\u901a\u8a71\u3057\u306a\u304c\u3089Salesforce\u306b\u60c5\u5831\u3092\u5165\u529b\u3057\u307e\u3059\u3002\u901a\u8a71\u4e2d\u306b\u8907\u6570\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u30b3\u30d4\u30fc\u3057\u3001\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3092\u78ba\u8a8d\u3057\u3001\u6b21\u306e\u767a\u4fe1\u5148\u3092\u9078\u3076\u2014\u2014\u3053\u306e\u7e70\u308a\u8fd4\u3057\u30921\u65e5\u6570\u767e\u56de\u3002<strong>\u6570\u79d2\u306e\u52b9\u7387\u5316\u304c\u30011\u65e5\u3067\u6570\u6642\u9593\u306e\u5dee<\/strong>\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001Salesforce\u4e0a\u306e\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u696d\u52d9\u3092\u52b9\u7387\u5316\u3059\u308bChrome\u62e1\u5f35\u6a5f\u80fd\u300cCX Operations Support\u300d\u3092\u5185\u88fd\u3057\u3001<strong>6\u3064\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u30921\u3064\u306e\u62e1\u5f35\u306b\u7d71\u5408\u3057\u305f<\/strong>\u8a2d\u8a08\u3068\u5b9f\u88c5\u3092\u516c\u958b\u3057\u307e\u3059\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>1. \u80cc\u666f \u2014 \u306a\u305cChrome\u62e1\u5f35\u3067\u89e3\u6c7a\u3057\u305f\u304b<\/h2>\n<h3>Salesforce\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3067\u306f\u306a\u304fChrome\u62e1\u5f35\u3092\u9078\u3093\u3060\u7406\u7531<\/h3>\n<p>Salesforce\u4e0a\u306e\u696d\u52d9\u52b9\u7387\u5316\u306a\u3089\u3001Lightning Web Components\uff08LWC\uff09\u3084\u30d5\u30ed\u30fc\u3067\u5bfe\u5fdc\u3059\u308b\u306e\u304c\u6b63\u9053\u3067\u3059\u3002\u3057\u304b\u3057\u79c1\u305f\u3061\u304c\u76f4\u9762\u3057\u3066\u3044\u305f\u306e\u306f<strong>Salesforce\u306e\u5916\u5074\u306e\u554f\u984c<\/strong>\u3067\u3057\u305f\u3002<\/p>\n<ul>\n<li><strong>\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u81ea\u52d5\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5<\/strong>: Salesforce\u306e\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306f\u624b\u52d5\u66f4\u65b0\u304c\u5fc5\u8981\u3002\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u8868\u793a\u306b\u306fAPI\u30dd\u30fc\u30ea\u30f3\u30b0\u304c\u5fc5\u8981\u3060\u304c\u3001API\u4e0a\u9650\u306e\u5236\u7d04\u3042\u308a<\/li>\n<li><strong>\u767a\u4fe1\u30ed\u30c3\u30af\u5236\u5fa1<\/strong>: \u7279\u5b9a\u6761\u4ef6\u4e0b\u3067\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u767a\u4fe1\u3092\u5236\u9650\u3059\u308b\u4ed5\u7d44\u307f\u304c\u3001Salesforce\u6a19\u6e96\u6a5f\u80fd\u3067\u306f\u5b9f\u73fe\u56f0\u96e3<\/li>\n<li><strong>\u8907\u6570\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30ef\u30f3\u30af\u30ea\u30c3\u30af\u30b3\u30d4\u30fc<\/strong>: Salesforce\u306e\u6a19\u6e96UI\u3067\u306f1\u30d5\u30a3\u30fc\u30eb\u30c9\u305a\u3064\u3057\u304b\u30b3\u30d4\u30fc\u3067\u304d\u306a\u3044<\/li>\n<p>\u3053\u308c\u3089\u306f<strong>\u30d6\u30e9\u30a6\u30b6\u5074\u3067DOM\u3092\u64cd\u4f5c<\/strong>\u3057\u306a\u3044\u3068\u89e3\u6c7a\u3067\u304d\u306a\u3044\u8ab2\u984c\u3067\u3059\u3002Chrome\u62e1\u5f35\u306a\u3089Salesforce\u306e\u753b\u9762\u4e0a\u306b\u6a5f\u80fd\u3092\u91cd\u306d\u5408\u308f\u305b\u3001\u6a19\u6e96UI\u3092\u62e1\u5f35\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3>\u6700\u521d\u306f\u30d0\u30e9\u30d0\u30e9\u3060\u3063\u305f<\/h3>\n<p>\u5f53\u521d\u306f\u8ab2\u984c\u3054\u3068\u306b\u500b\u5225\u306eChrome\u62e1\u5f35\u3092\u958b\u767a\u3057\u3066\u3044\u307e\u3057\u305f\u3002\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u81ea\u52d5\u66f4\u65b0\u7528\u3001\u30d5\u30a3\u30fc\u30eb\u30c9\u30b3\u30d4\u30fc\u7528\u3001\u767a\u4fe1\u30ed\u30c3\u30af\u7528\u2014\u2014\u8a085\u3064\u306e\u62e1\u5f35\u304c\u4e26\u884c\u7a3c\u50cd\u3002<\/p>\n<p>\u554f\u984c\u306f<strong>\u7ba1\u7406\u30b3\u30b9\u30c8<\/strong>\u3067\u3059\u30025\u3064\u306e\u62e1\u5f35\u3092\u5168\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306ePC\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30fb\u66f4\u65b0\u3059\u308b\u904b\u7528\u304c\u7834\u7dbb\u3057\u304b\u3051\u3066\u3044\u307e\u3057\u305f\u3002\u30d0\u30fc\u30b8\u30e7\u30f3\u4e0d\u4e00\u81f4\u3001\u62e1\u5f35\u540c\u58eb\u306e\u7af6\u5408\u3001\u8a2d\u5b9a\u306e\u5206\u6563\u2014\u2014\u3053\u308c\u30921\u3064\u306b\u7d71\u5408\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u59cb\u307e\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>2. \u8ab2\u984c \u2014 Chrome\u62e1\u5f35\u7d71\u5408\u306e4\u3064\u306e\u58c1<\/h2>\n<p>| # | \u8ab2\u984c | \u96e3\u6613\u5ea6 | \u8a73\u7d30 |<br \/>\n|&#8212;|&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;|<br \/>\n| 1 | Manifest V3\u79fb\u884c | \u9ad8 | \u65e7\u62e1\u5f35\u306fManifest V2\u3002V2\u306f2024\u5e74\u4ee5\u964d\u975e\u63a8\u5968 |<br \/>\n| 2 | \u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u306e\u8a2d\u5b9a\u7ba1\u7406 | \u4e2d | 6\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u500b\u5225\u306b\u8a2d\u5b9a\u3092\u6301\u3064\u3068\u6df7\u4e71\u3059\u308b |<br \/>\n| 3 | Salesforce DOM \u306e\u4e0d\u5b89\u5b9a\u3055 | \u9ad8 | Lightning\u306eDOM\u306f\u52d5\u7684\u751f\u6210\u3067\u30bb\u30ec\u30af\u30bf\u30fc\u304c\u5909\u308f\u308a\u3084\u3059\u3044 |<br \/>\n| 4 | \u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af | \u4e2d | \u62e1\u5f35\u304c\u5168\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306ePC\u3067\u6b63\u3057\u304f\u52d5\u3044\u3066\u3044\u308b\u304b\u76e3\u8996 |<\/p>\n<p>\u7279\u306b\u8ab2\u984c1\u306eManifest V3\u79fb\u884c\u304c\u6280\u8853\u7684\u306b\u6700\u3082\u30a4\u30f3\u30d1\u30af\u30c8\u304c\u5927\u304d\u304b\u3063\u305f\u3002V2\u306eBackground Pages\uff08\u5e38\u99d0\u30b9\u30af\u30ea\u30d7\u30c8\uff09\u304cV3\u3067\u306fService Worker\uff08\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\uff09\u306b\u5909\u308f\u308a\u3001<strong>\u72b6\u614b\u7ba1\u7406\u306e\u30e2\u30c7\u30eb\u304c\u6839\u672c\u7684\u306b\u5909\u66f4<\/strong>\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>3. \u8a2d\u8a08 \u2014 \u30e2\u30b8\u30e5\u30e9\u30fcChrome\u62e1\u5f35\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h2>\n<pre><code class=\"language-mermaid\">graph TD\n    subgraph Extension[\"CX Operations Support\"]\n        BG[Service Worker&lt;br\/&gt;background.js]\n        POPUP[Popup UI&lt;br\/&gt;\u8a2d\u5b9a\u753b\u9762]\n        SETTINGS[Settings Manager&lt;br\/&gt;chrome.storage]\n    end\n\n    subgraph Modules[\"6 Modules\"]\n        M1[dashboard-refresh&lt;br\/&gt;\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u81ea\u52d5\u66f4\u65b0]\n        M2[dial-lock&lt;br\/&gt;\u767a\u4fe1\u30ed\u30c3\u30af\u5236\u5fa1]\n        M3[field-copier&lt;br\/&gt;\u30d5\u30a3\u30fc\u30eb\u30c9\u4e00\u62ec\u30b3\u30d4\u30fc]\n        M4[off-phone-monitor&lt;br\/&gt;\u96e2\u5e2d\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0]\n        M5[reaction-checker&lt;br\/&gt;\u5fdc\u7b54\u30c1\u30a7\u30c3\u30af]\n        M6[staff-selector&lt;br\/&gt;\u62c5\u5f53\u8005\u9078\u629eUI]\n    end\n\n    subgraph External[\"External\"]\n        SF[Salesforce&lt;br\/&gt;Lightning]\n        GAS[Google Apps Script&lt;br\/&gt;\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af]\n        SENTRY[Sentry&lt;br\/&gt;\u30a8\u30e9\u30fc\u76e3\u8996]\n    end\n\n    BG --&gt; M1\n    BG --&gt; M2\n    BG --&gt; M3\n    BG --&gt; M4\n    BG --&gt; M5\n    BG --&gt; M6\n    POPUP --&gt; SETTINGS\n    SETTINGS --&gt; BG\n    M1 --&gt; SF\n    M2 --&gt; SF\n    M3 --&gt; SF\n    BG --&gt; GAS\n    BG --&gt; SENTRY\n\n    style BG fill:#3b82f6,color:#fff\n    style SETTINGS fill:#f59e0b,color:#fff\n    style GAS fill:#10b981,color:#fff<\/code><\/pre>\n<h3>\u8a2d\u8a08\u5224\u65ad\u2460: \u30e2\u30b8\u30e5\u30fc\u30eb\u5206\u96e2\u30d1\u30bf\u30fc\u30f3<\/h3>\n<p>6\u3064\u306e\u6a5f\u80fd\u30921\u3064\u306e\u62e1\u5f35\u306b\u7d71\u5408\u3059\u308b\u306b\u3042\u305f\u308a\u3001<strong>\u30e2\u30b8\u30e5\u30fc\u30eb\u5358\u4f4d\u3067\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u5206\u96e2<\/strong>\u3059\u308b\u8a2d\u8a08\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre><code class=\"language-text\">modules\/\n\u251c\u2500\u2500 dashboard-refresh\/\n\u2502   \u2514\u2500\u2500 content.js\n\u251c\u2500\u2500 dial-lock\/\n\u2502   \u251c\u2500\u2500 background.js\n\u2502   \u251c\u2500\u2500 content.js\n\u2502   \u2514\u2500\u2500 injected.js\n\u251c\u2500\u2500 field-copier\/\n\u2502   \u251c\u2500\u2500 content.js\n\u2502   \u2514\u2500\u2500 styles.css\n\u251c\u2500\u2500 off-phone-monitor\/\n\u2502   \u251c\u2500\u2500 background.js\n\u2502   \u251c\u2500\u2500 content.js\n\u2502   \u2514\u2500\u2500 injected.js\n\u251c\u2500\u2500 reaction-checker\/\n\u2502   \u2514\u2500\u2500 background.js\n\u2514\u2500\u2500 staff-selector\/\n    \u251c\u2500\u2500 background.js\n    \u251c\u2500\u2500 content.js\n    \u251c\u2500\u2500 injected.js\n    \u2514\u2500\u2500 injected.css<\/code><\/pre>\n<p>\u5404\u30e2\u30b8\u30e5\u30fc\u30eb\u306f<strong>content script<\/strong>\uff08Salesforce\u30da\u30fc\u30b8\u306b\u6ce8\u5165\uff09\u3068<strong>background script<\/strong>\uff08Service Worker\u3067\u51e6\u7406\uff09\u306e\u7d44\u307f\u5408\u308f\u305b\u3002\u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u306e\u4f9d\u5b58\u306f\u30bc\u30ed\u306b\u3057\u30011\u3064\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u5316\u3057\u3066\u3082\u4ed6\u306b\u5f71\u97ff\u3057\u306a\u3044\u8a2d\u8a08\u3067\u3059\u3002<\/p>\n<h3>\u8a2d\u8a08\u5224\u65ad\u2461: Settings Manager\u306b\u3088\u308b\u4e00\u5143\u7ba1\u7406<\/h3>\n<p>6\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u8a2d\u5b9a\uff08\u6709\u52b9\/\u7121\u52b9\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\uff09\u3092<code>chrome.storage.sync<\/code>\u3067\u4e00\u5143\u7ba1\u7406\u3002Popup\u306eUI\u304b\u3089\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u306eON\/OFF\u3092\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-javascript\">\/\/ Settings Manager: \u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\u306e\u4e00\u5143\u7ba1\u7406\nclass SettingsManager {\n  static async getModuleSettings(moduleName) {\n    const result = await chrome.storage.sync.get(moduleName);\n    return result[moduleName] ?? { enabled: true };\n  }\n\n  static async setModuleSettings(moduleName, settings) {\n    await chrome.storage.sync.set({ [moduleName]: settings });\n  }\n}<\/code><\/pre>\n<p><code>chrome.storage.sync<\/code>\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304cPC\u3092\u5909\u3048\u3066\u3082\u8a2d\u5b9a\u304c\u540c\u671f\u3055\u308c\u307e\u3059\u3002<\/p>\n<h3>\u8a2d\u8a08\u5224\u65ad\u2462: Manifest V3\u5bfe\u5fdc<\/h3>\n<p>| V2\uff08\u65e7\uff09 | V3\uff08\u65b0\uff09 | \u5f71\u97ff |<br \/>\n|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| Background Pages\uff08\u5e38\u99d0\uff09 | Service Worker\uff08\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\uff09 | \u72b6\u614b\u3092\u30e1\u30e2\u30ea\u306b\u4fdd\u6301\u3067\u304d\u306a\u3044 \u2192 `chrome.storage`\u306b\u6c38\u7d9a\u5316 |<br \/>\n| `chrome.browserAction` | `chrome.action` | API\u540d\u5909\u66f4 |<br \/>\n| Content Script \u304b\u3089\u76f4\u63a5DOM\u64cd\u4f5c | `chrome.scripting.executeScript` | \u52d5\u7684\u6ce8\u5165\u304c\u5fc5\u8981 |<br \/>\n| XMLHttpRequest | Fetch API | \u975e\u540c\u671f\u51e6\u7406\u30e2\u30c7\u30eb\u5909\u66f4 |<\/p>\n<p>\u6700\u5927\u306e\u5909\u66f4\u306fService Worker\u3067\u3059\u3002V2\u3067\u306f\u5e38\u99d0\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u72b6\u614b\u3092\u4fdd\u6301\u3067\u304d\u307e\u3057\u305f\u304c\u3001V3\u3067\u306fService Worker\u304c\u4e00\u5b9a\u6642\u9593\u3067\u505c\u6b62\u3057\u307e\u3059\u3002\u30bf\u30a4\u30de\u30fc\u51e6\u7406\uff08\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u81ea\u52d5\u66f4\u65b0\u3001\u96e2\u5e2d\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\uff09\u306f<code>chrome.alarms<\/code>API\u306b\u79fb\u884c\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre><code class=\"language-javascript\">\/\/ V2\uff08\u65e7\uff09: setInterval \u3067\u5e38\u99d0\nsetInterval(() =&gt; refreshDashboard(), 5 * 60 * 1000);\n\n\/\/ V3\uff08\u65b0\uff09: chrome.alarms \u3067\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\nchrome.alarms.create('dashboard-refresh', { periodInMinutes: 5 });\nchrome.alarms.onAlarm.addListener((alarm) =&gt; {\n  if (alarm.name === 'dashboard-refresh') {\n    chrome.tabs.query({ url: '*:\/\/*.force.com\/*' }, (tabs) =&gt; {\n      tabs.forEach(tab =&gt; chrome.scripting.executeScript({\n        target: { tabId: tab.id },\n        func: () =&gt; document.querySelector('[title=\"\u66f4\u65b0\"]')?.click(),\n      }));\n    });\n  }\n});<\/code><\/pre>\n<p>&#8212;<\/p>\n<h2>4. \u5b9f\u88c5 \u2014 6\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u6982\u8981<\/h2>\n<p>\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u30a8\u30f3\u30b8\u30cb\u30a21\u540d\u304c\u4e3b\u62c5\u5f53\u3067\u3001Salesforce\u30a8\u30f3\u30b8\u30cb\u30a21\u540d\u304cLightning DOM\u89e3\u6790\u3092\u652f\u63f4\u3059\u308b2\u540d\u4f53\u5236\u3067\u3059\u3002<\/p>\n<h3>Module 1: dashboard-refresh\uff08\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u81ea\u52d5\u66f4\u65b0\uff09<\/h3>\n<p>Salesforce\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u300c\u66f4\u65b0\u300d\u30dc\u30bf\u30f3\u3092Content Script\u3067\u5b9a\u671f\u7684\u306b\u30af\u30ea\u30c3\u30af\u3002<code>chrome.alarms<\/code>\u30675\u5206\u9593\u9694\u306b\u8a2d\u5b9a\u3002SV\uff08\u30b9\u30fc\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\uff09\u304c\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u3067KPI\u3092\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<h3>Module 2: dial-lock\uff08\u767a\u4fe1\u30ed\u30c3\u30af\u5236\u5fa1\uff09<\/h3>\n<p>\u7279\u5b9a\u6761\u4ef6\uff08\u7814\u4fee\u4e2d\u3001\u4f11\u61a9\u4e2d\u3001\u5f8c\u51e6\u7406\u4e2d\uff09\u3067\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u767a\u4fe1\u30dc\u30bf\u30f3\u3092\u975e\u6d3b\u6027\u5316\u3002Salesforce\u306e\u753b\u9762\u4e0a\u306b<code>injected.js<\/code>\u3067\u30aa\u30fc\u30d0\u30fc\u30ec\u30a4\u3092\u8868\u793a\u3057\u3001\u8aa4\u767a\u4fe1\u3092\u9632\u6b62\u3002\u63d0\u643a\u5148\u3054\u3068\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u6761\u4ef6\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u3002<\/p>\n<h3>Module 3: field-copier\uff08\u30d5\u30a3\u30fc\u30eb\u30c9\u4e00\u62ec\u30b3\u30d4\u30fc\uff09<\/h3>\n<p>\u9867\u5ba2\u60c5\u5831\uff08\u6c0f\u540d\u30fb\u4f4f\u6240\u30fb\u96fb\u8a71\u756a\u53f7\u30fb\u5951\u7d04\u756a\u53f7\uff09\u3092\u30ef\u30f3\u30af\u30ea\u30c3\u30af\u3067\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3002Salesforce\u306e\u6a19\u6e96UI\u3067\u306f1\u30d5\u30a3\u30fc\u30eb\u30c9\u305a\u3064\u30b3\u30d4\u30fc\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3057\u305f\u304c\u3001\u3053\u306e\u62e1\u5f35\u3067<strong>1\u30af\u30ea\u30c3\u30af\u3067\u5168\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u30bf\u30d6\u533a\u5207\u308a\u3067\u30b3\u30d4\u30fc<\/strong>\u3002\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u5165\u529b\u5de5\u6570\u3092\u5927\u5e45\u306b\u524a\u6e1b\u3002<\/p>\n<h3>Module 4: off-phone-monitor\uff08\u96e2\u5e2d\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\uff09<\/h3>\n<p>\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\uff08\u901a\u8a71\u4e2d\/\u5f85\u6a5f\u4e2d\/\u96e2\u5e2d\u4e2d\uff09\u3092\u76e3\u8996\u3057\u3001\u9577\u6642\u9593\u96e2\u5e2d\u3092SV\u306b\u901a\u77e5\u3002Background Service Worker\u304b\u3089GAS\u306bheartbeat\u3092\u9001\u4fe1\u3057\u3001GAS\u5074\u3067\u96c6\u8a08\u3002<\/p>\n<h3>Module 5: reaction-checker\uff08\u5fdc\u7b54\u30c1\u30a7\u30c3\u30af\uff09<\/h3>\n<p>\u7740\u4fe1\u5f8c\u306e\u5fdc\u7b54\u6642\u9593\u3092\u8a08\u6e2c\u3057\u3001\u57fa\u6e96\u5024\uff083\u79d2\uff09\u3092\u8d85\u3048\u305f\u5834\u5408\u306b\u30a2\u30e9\u30fc\u30c8\u8868\u793a\u3002<\/p>\n<h3>Module 6: staff-selector\uff08\u62c5\u5f53\u8005\u9078\u629eUI\uff09<\/h3>\n<p>\u901a\u8a71\u3092\u8ee2\u9001\u3059\u308b\u969b\u306e\u62c5\u5f53\u8005\u9078\u629eUI\u3092\u62e1\u5f35\u3002Salesforce\u306e\u6a19\u6e96\u8ee2\u9001UI\u3088\u308a\u9ad8\u901f\u306b\u64cd\u4f5c\u3067\u304d\u308b\u30ab\u30b9\u30bf\u30e0\u30c9\u30ed\u30c3\u30d7\u30c0\u30a6\u30f3\u3092<code>injected.js<\/code>\u3067\u6ce8\u5165\u3002<\/p>\n<h3>\u5931\u6557: Salesforce\u306eDOM\u5909\u66f4\u3067\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u58ca\u308c\u305f<\/h3>\n<p>\u6700\u5927\u306e\u5931\u6557\u306f\u3001<strong>Salesforce\u306eLightning UI\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3067DOM\u30bb\u30ec\u30af\u30bf\u30fc\u304c\u4e00\u6589\u306b\u5909\u308f\u3063\u305f<\/strong>\u3053\u3068\u3002\u7279\u306bfield-copier\u304c\u30d5\u30a3\u30fc\u30eb\u30c9\u5024\u3092\u53d6\u5f97\u3059\u308b\u30bb\u30ec\u30af\u30bf\u30fc\u304c\u5168\u6ec5\u3057\u30011\u65e5\u4e2d\u5168\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304c\u30b3\u30d4\u30fc\u6a5f\u80fd\u3092\u4f7f\u3048\u306a\u3044\u72b6\u614b\u306b\u3002<\/p>\n<p>\u5bfe\u7b56\u3068\u3057\u3066\u3001<strong>\u30bb\u30ec\u30af\u30bf\u30fc\u3092\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306b\u5916\u51fa\u3057<\/strong>\u3057\u3001DOM\u304c\u5909\u308f\u3063\u305f\u5834\u5408\u306b\u30b3\u30fc\u30c9\u3092\u5909\u66f4\u305b\u305a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u66f4\u65b0\u3060\u3051\u3067\u5bfe\u5fdc\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002\u3055\u3089\u306bSentry\u3067\u30a8\u30e9\u30fc\u3092\u5373\u5ea7\u306b\u691c\u51fa\u3057\u3001\u30bb\u30ec\u30af\u30bf\u30fc\u5931\u6557\u306e\u30a2\u30e9\u30fc\u30c8\u304cSlack\u306b\u98db\u3076\u4ed5\u7d44\u307f\u3092\u8ffd\u52a0\u3002\u3053\u306e\u6539\u5584\u5f8c\u306f\u3001DOM\u5909\u66f4\u306e\u691c\u51fa\u2192\u30bb\u30ec\u30af\u30bf\u30fc\u4fee\u6b63\u2192Chrome Web Store\u66f4\u65b0\u3067<strong>\u5e73\u57472\u6642\u9593\u4ee5\u5185\u306b\u5fa9\u65e7<\/strong>\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>5. \u7d50\u679c \u2014 \u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u696d\u52d9\u306e\u5b9a\u91cf\u6539\u5584<\/h2>\n<p>30\u540d\u306e\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306b\u5c55\u958b\u5f8c\u30011\u30f6\u6708\u9593\u306e\u8a08\u6e2c\u30c7\u30fc\u30bf\u3067\u3059\u3002<\/p>\n<p>| \u6307\u6a19 | Before | After | \u6539\u5584\u7387 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;-|&#8212;&#8212;&#8211;|<br \/>\n| \u30d5\u30a3\u30fc\u30eb\u30c9\u30b3\u30d4\u30fc\u64cd\u4f5c\u6642\u9593\/\u4ef6 | 15\u79d2\uff085\u30d5\u30a3\u30fc\u30eb\u30c9\u00d73\u79d2\uff09 | 1\u79d2\uff08\u30ef\u30f3\u30af\u30ea\u30c3\u30af\uff09 | **-93%** |<br \/>\n| \u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u66f4\u65b0\u5fd8\u308c\u306b\u3088\u308bKPI\u9045\u5ef6 | \u90313-5\u56de | 0\u56de | **\u30bc\u30ed\u9054\u6210** |<br \/>\n| \u8aa4\u767a\u4fe1\u4ef6\u6570\/\u6708 | \u5e73\u57478\u4ef6 | \u5e73\u57471\u4ef6\uff08\u62e1\u5f35\u672a\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306e\u30b2\u30b9\u30c8\u7aef\u672b\u304b\u3089\uff09 | **-88%** |<br \/>\n| \u62e1\u5f35\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u4e0d\u4e00\u81f4\u554f\u984c | \u67082-3\u56de | 0\u56de\uff081\u62e1\u5f35\u306b\u7d71\u5408\uff09 | **\u30bc\u30ed\u9054\u6210** |<br \/>\n| \u62e1\u5f35\u7ba1\u7406\u5de5\u6570\uff08IT\u90e8\u9580\uff09 | 5\u62e1\u5f35\u00d7\u67082\u6642\u9593 | 1\u62e1\u5f35\u00d7\u67081\u6642\u9593 | **-90%** |<\/p>\n<h3>1\u4ef615\u79d2\u306e\u4fa1\u5024<\/h3>\n<p>\u300c15\u79d2\u21921\u79d2\u300d\u306f\u5c0f\u3055\u304f\u898b\u3048\u307e\u3059\u304c\u3001\u30aa\u30da\u30ec\u30fc\u30bf\u30fc30\u540d\u304c1\u65e5\u5e73\u574780\u4ef6\u30b3\u30d4\u30fc\u64cd\u4f5c\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li>Before: 30\u540d \u00d7 80\u4ef6 \u00d7 15\u79d2 = <strong>10\u6642\u9593\/\u65e5<\/strong><\/li>\n<li>After: 30\u540d \u00d7 80\u4ef6 \u00d7 1\u79d2 = <strong>40\u5206\/\u65e5<\/strong><\/li>\n<p>field-copier 1\u3064\u3060\u3051\u3067<strong>1\u65e5\u3042\u305f\u308a9\u6642\u9593\u4ee5\u4e0a\u306e\u5de5\u6570\u524a\u6e1b<\/strong>\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>6. \u5c55\u671b \u2014 \u6b21\u306b\u53d6\u308a\u7d44\u3080\u3053\u3068<\/h2>\n<h3>GAS\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u5f37\u5316<\/h3>\n<p>\u73fe\u5728\u306f\u62e1\u5f35\u304b\u3089GAS\u306bheartbeat\u3092\u9001\u4fe1\u3057\u3066\u6b7b\u6d3b\u76e3\u8996\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30e2\u30b8\u30e5\u30fc\u30eb\u5358\u4f4d\u306e\u7a3c\u50cd\u72b6\u6cc1\u3092\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u5316\u3057\u3001\u300c\u3069\u306e\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u505c\u6b62\u3057\u3066\u3044\u308b\u304b\u300d\u3092\u4e00\u76ee\u3067\u628a\u63e1\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u8a08\u753b\u3067\u3059\u3002<\/p>\n<h3>\u8a2d\u5b9a\u306e\u30ea\u30e2\u30fc\u30c8\u914d\u4fe1<\/h3>\n<p>\u73fe\u5728\u306fchrome.storage.sync\u3067\u8a2d\u5b9a\u3092\u7ba1\u7406\u3057\u3066\u3044\u307e\u3059\u304c\u3001IT\u90e8\u9580\u304cWeb\u7ba1\u7406\u753b\u9762\u304b\u3089\u5168\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306e\u8a2d\u5b9a\u3092\u4e00\u62ec\u5909\u66f4\u3067\u304d\u308b\u4ed5\u7d44\u307f\u3092\u69cb\u7bc9\u4e2d\u3067\u3059\u3002\u65b0\u3057\u3044\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u6709\u52b9\u5316\u3084\u3001\u63d0\u643a\u5148\u56fa\u6709\u306e\u8a2d\u5b9a\u5909\u66f4\u3092\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u306b\u89e6\u3089\u305b\u305a\u306b\u9069\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>&#8212;<\/p>\n<p>Chrome\u62e1\u5f35\u306e\u958b\u767a\u306f\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u306e\u77e5\u8b58\u3067\u59cb\u3081\u3089\u308c\u307e\u3059\u304c\u3001<strong>Manifest V3\u306eService Worker\u5236\u7d04\u3001Salesforce\u306eDOM\u4e0d\u5b89\u5b9a\u6027\u300130\u540d\u898f\u6a21\u3078\u306e\u5c55\u958b<\/strong>\u3068\u3044\u3046\u5b9f\u904b\u7528\u306e\u8ab2\u984c\u306f\u3001\u4f5c\u3063\u3066\u307f\u306a\u3044\u3068\u308f\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n<p>\u793e\u5185\u30c4\u30fc\u30eb\u306e\u5185\u88fd\u306b\u8208\u5473\u304c\u3042\u308b\u65b9\u3001\u305c\u3072\u304a\u8a71\u3057\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>&#8212;<\/p>\n<h2>\u63a1\u7528\u60c5\u5831<\/h2>\n<p>ClassLab \u3067\u306f\u4e00\u7dd2\u306b\u6280\u8853\u7684\u6311\u6226\u306b\u53d6\u308a\u7d44\u3080\u30a8\u30f3\u30b8\u30cb\u30a2\u3092\u52df\u96c6\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li><a href=\"https:\/\/findy-code.io\/companies\/994\">Findy\u3067\u30a8\u30f3\u30b8\u30cb\u30a2\u6c42\u4eba\u3092\u898b\u308b<\/a><\/li>\n<li><a href=\"https:\/\/classlab.co.jp\/engineer\/entry\/\">\u30ab\u30b8\u30e5\u30a2\u30eb\u9762\u8ac7\u3092\u7533\u3057\u8fbc\u3080<\/a><\/li>\n<h3>\u95a2\u9023\u8a18\u4e8b<\/h3>\n<ul>\n<li><a href=\"https:\/\/classlab.co.jp\/engineer\/blog\/first-year-product-owner\/\">\u5165\u793e1\u5e74\u76ee\u3067\u30d7\u30ed\u30c0\u30af\u30c8\u30aa\u30fc\u30ca\u30fc\u3092\u4efb\u3055\u308c\u305f\u8a71<\/a><\/li>\n<li><a href=\"https:\/\/classlab.co.jp\/engineer\/blog\/ai-driven-dev-team\/\">Claude Code\u5168\u54e1\u5c0e\u5165\u3067\u30ec\u30d3\u30e5\u30fc\u6642\u959374%\u77ed\u7e2e\u3057\u305f\u8a71<\/a><\/li>\n<p>&#8212;<\/p>\n<blockquote>\n<p><strong>ClassLab Engineering<\/strong> \u30c1\u30fc\u30e0\u30e1\u30f3\u30d0\u30fc\u304c\u57f7\u7b46\u3057\u307e\u3057\u305f\u3002<\/p>\n<\/blockquote>\n<p>><\/p>\n<blockquote>\n<p>ClassLab.\u3067\u306f\u3001\u4e00\u7dd2\u306b\u30d7\u30ed\u30c0\u30af\u30c8\u3092\u4f5c\u308b\u30a8\u30f3\u30b8\u30cb\u30a2\u3092\u52df\u96c6\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/blockquote>\n<blockquote>\n<p>\u30ab\u30b8\u30e5\u30a2\u30eb\u9762\u8ac7\u3082\u5927\u6b53\u8fce\u3067\u3059\uff01<\/p>\n<\/blockquote>\n<p>><\/p>\n<blockquote>\n<p><a href=\"https:\/\/findy-code.io\/companies\/2772\">Findy\u3067\u8a71\u3092\u805e\u304f<\/a> | <a href=\"https:\/\/classlab.co.jp\/engineer\/\">\u63a1\u7528\u60c5\u5831\u3092\u898b\u308b<\/a><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u30b3\u30fc\u30eb\u30bb\u30f3\u30bf\u30fc\u306eSalesforce\u696d\u52d9\u3092\u52b9\u7387\u5316\u3059\u308bChrome\u62e1\u5f35\u6a5f\u80fd\u3092\u5185\u88fd\u30026\u30e2\u30b8\u30e5\u30fc\u30eb\u7d71\u5408\u30fbManifest V3\u5bfe\u5fdc\u30fbGAS\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u8a2d\u8a08\u3068\u5b9f\u88c5\u3092\u516c\u958b\u3002<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","footnotes":""},"categories":[31],"tags":[41,44,45],"class_list":["post-136","post","type-post","status-publish","format-standard","hentry","category-project-story","tag-chrome","tag-javascript","tag-45"],"_links":{"self":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts\/136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/comments?post=136"}],"version-history":[{"count":0,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/posts\/136\/revisions"}],"wp:attachment":[{"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/media?parent=136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/categories?post=136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/classlab.co.jp\/engineer\/blog\/wp-json\/wp\/v2\/tags?post=136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}