{"id":76115,"date":"2024-09-08T15:51:47","date_gmt":"2024-09-08T12:21:47","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/"},"modified":"2024-09-08T15:51:47","modified_gmt":"2024-09-08T12:21:47","slug":"building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/","title":{"rendered":"\u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 XY \u062a\u0639\u0627\u0645\u0644\u06cc \u0628\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps \u0648 Leaflet.js"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang Google Maps \u062f\u0627\u0631\u0627\u06cc \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u062a\u0631\u0633\u06cc\u0645 \u0646\u0642\u0627\u0637 \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u0642\u0627\u0637 \u0631\u0627 \u062a\u0631\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f \u0631\u0648\u06cc \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631? \u0627\u06cc\u0646 \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc XY Image Plot \u0645\u0639\u0645\u0648\u0644\u0627 \u0628\u0631\u0627\u06cc \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc \u0637\u0628\u0642\u0647\u060c \u0628\u0627\u0632\u0631\u0633\u06cc \u0645\u062d\u0644 \u06a9\u0627\u0631 \u0648 \u062d\u062a\u06cc \u0628\u0627\u0632\u06cc \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u062a\u0639\u0627\u0645\u0644\u06cc \u0628\u0627 \u0646\u0642\u0627\u0637 \u0642\u0627\u0628\u0644 \u06a9\u0634\u06cc\u062f\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Leaflet.js \u0648 Google Apps Script \u0631\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f. \u0645\u0627 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u0642\u0634\u0647 \u06af\u0631\u0641\u062a\u0647 \u062a\u0627 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0627\u0632 Google Sheets \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0646 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f:<\/p>\n<p>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Leaflet.js \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 HTML \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps<br \/>\n\u0646\u0645\u0627\u06cc\u0634 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc Google Sheets<br \/>\n\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0631\u062f\u06cc\u0641 \u0628\u0631\u06af\u0647\u200c\u0647\u0627 \u0647\u0646\u06af\u0627\u0645 \u062c\u0627\u0628\u062c\u0627\u06cc\u06cc \u0646\u0634\u0627\u0646\u06af\u0631<br \/>\n\u0627\u06cc\u062c\u0627\u062f \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u0632 \u0646\u0642\u0634\u0647 \u0648 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0631 Sheets<br \/>\n\u062d\u0630\u0641 \u0646\u0634\u0627\u0646\u06af\u0631 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Leaflet.js \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 HTML \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps<\/p>\n<p>Leaflet.js \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628 \u062a\u0631\u06cc\u0646 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0646\u06af\u0627\u0634\u062a \u0645\u062a\u0646 \u0628\u0627\u0632 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0633\u0628\u06a9 \u0648\u0632\u0646\u060c \u0622\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0648 \u062f\u0627\u0631\u0627\u06cc \u0627\u0633\u0646\u0627\u062f \u0639\u0627\u0644\u06cc \u0627\u0633\u062a. \u0622\u0646\u0647\u0627 \u0627\u0632 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0646\u0642\u0634\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 &#8220;CRS.Simple&#8221;\u060c \u06cc\u0627 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0631\u062c\u0639 \u0645\u062e\u062a\u0635\u0627\u062a\u060c \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f.<\/p>\n<p>  \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0627\u0631\u0628\u0631\u06af\u200c\u0646\u06af\u0627\u0631 Google<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u06af\u0647 \u0628\u0647 \u200b\u200b\u0646\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f map_pin \u0628\u0627 \u0633\u0627\u062e\u062a\u0627\u0631 \u0632\u06cc\u0631:<\/p>\n<p>\u0634\u0646\u0627\u0633\u0647<br \/>\n\u0639\u0646\u0648\u0627\u0646<br \/>\nx<br \/>\ny<\/p>\n<p>1<br \/>\n\u062a\u0633\u062a 1<br \/>\n10<br \/>\n30<\/p>\n<p>2<br \/>\n\u062a\u0633\u062a 2<br \/>\n50<br \/>\n80<\/p>\n<p>\u0633\u067e\u0633 Apps Script \u0631\u0627 \u0627\u0632 \u0645\u0646\u0648\u06cc Extensions \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 HTML<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u0645\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0627\u0635\u0644\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f Leaflet \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06a9\u0627\u0631 \u06a9\u0646\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062b\u0627\u0644 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u062f\u0631 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0634\u0631\u0648\u0639 \u0633\u0631\u06cc\u0639 \u0622\u0646\u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 HTML \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 Index \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>&lt;!DOCTYPE html&gt;<br \/>\n&lt;html&gt;<br \/>\n&lt;head&gt;<br \/>\n  &lt;title&gt;Quick Start &#8211; Leaflet&lt;\/title&gt;<br \/>\n  &lt;meta charset=&#8221;utf-8&#8243; \/&gt;<br \/>\n  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;<br \/>\n  &lt;link rel=&#8221;stylesheet&#8221; href=&#8221;https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.css&#8221; \/&gt;<br \/>\n  &lt;style&gt;<br \/>\n    #map {<br \/>\n      height: 400px;<br \/>\n    }<br \/>\n  &lt;\/style&gt;<br \/>\n&lt;\/head&gt;<br \/>\n&lt;body&gt;<br \/>\n  &lt;div id=&#8221;map&#8221;&gt;&lt;\/div&gt;<\/p>\n<p>  &lt;script src=&#8221;https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.js&#8221;&gt;&lt;\/script&gt;<br \/>\n  &lt;script&gt;<br \/>\n    var map = L.map(&#8216;map&#8217;).setView([40.73, -73.99], 13);<\/p>\n<p>    L.tileLayer(&#8216;https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png&#8217;, {<br \/>\n      maxZoom: 19,<br \/>\n      attribution: &#8216;\u00a9 OpenStreetMap&#8217;<br \/>\n    }).addTo(map);<\/p>\n<p>    var marker = L.marker([40.73, -73.99]).addTo(map)<br \/>\n      .bindPopup(&#8216;Test Popup Message&#8217;)<br \/>\n      .openPopup();<br \/>\n  &lt;\/script&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/p>\n<p>\u0633\u067e\u0633 \u0641\u0627\u06cc\u0644 Code.gs \u0631\u0627 \u0628\u0627:<\/p>\n<p>function doGet() {<br \/>\n  const html = HtmlService.createHtmlOutputFromFile(&#8216;Index&#8217;)<br \/>\n    .setTitle(&#8216;Map with Draggable Points&#8217;)<br \/>\n    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);<br \/>\n  return html;<br \/>\n}<\/p>\n<p>\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0631\u0648\u06cc Deploy \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u0646\u062a\u0634\u0631 \u06a9\u0646\u06cc\u062f. \u0633\u067e\u0633 \u067e\u06cc\u0648\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062c\u062f\u06cc\u062f \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627\u06cc\u062f Leaflet.js \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0646\u0645\u0627\u06cc\u0634 \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u062f\u0631 \u0646\u06cc\u0648\u06cc\u0648\u0631\u06a9 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u062e\u0648\u0628\u060c \u0627\u06cc\u0646 \u0646\u0645\u0648\u0646\u0647 \u0646\u0642\u0634\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Leaflet \u0627\u0633\u062a. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0633\u0631\u0627\u063a \u0646\u0648\u0639 \u0646\u0642\u0634\u0647 CRS.Simple \u0645\u06cc \u0631\u0648\u06cc\u0645 \u06a9\u0647 \u0627\u0645\u06a9\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>HTML \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0627\u0632 Leaflet Tutorials \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>&lt;!DOCTYPE html&gt;<br \/>\n&lt;html&gt;<br \/>\n&lt;head&gt;<br \/>\n  &lt;title&gt;CRS Simple Example &#8211; Leaflet&lt;\/title&gt;<br \/>\n  &lt;meta charset=&#8221;utf-8&#8243; \/&gt;<br \/>\n  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;<br \/>\n  &lt;link rel=&#8221;stylesheet&#8221; href=&#8221;https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.css&#8221; \/&gt;<br \/>\n  &lt;style&gt;<br \/>\n    #map {<br \/>\n      height: 400px;<br \/>\n      width: 600px;<br \/>\n    }<br \/>\n    body {<br \/>\n      margin: 0;<br \/>\n      padding: 0;<br \/>\n    }<br \/>\n  &lt;\/style&gt;<br \/>\n&lt;\/head&gt;<br \/>\n&lt;body&gt;<br \/>\n  &lt;div id=&#8221;map&#8221;&gt;&lt;\/div&gt;<\/p>\n<p>  &lt;script src=&#8221;https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.js&#8221;&gt;&lt;\/script&gt;<br \/>\n  &lt;script&gt;<br \/>\n    \/\/ Set up the map with a simple CRS (no geographic projection)<br \/>\n    var map = L.map(&#8216;map&#8217;, {<br \/>\n      crs: L.CRS.Simple,<br \/>\n      minZoom: -1,<br \/>\n      maxZoom: 4<br \/>\n    });<\/p>\n<p>    \/\/ Define the dimensions of the image<br \/>\n    var bounds = [[0, 0], [1000, 1000]];<br \/>\n    var image = L.imageOverlay(&#8216;https:\/\/leafletjs.com\/examples\/crs-simple\/uqm_map_full.png&#8217;, bounds).addTo(map);<\/p>\n<p>    \/\/ Set the initial view of the map to show the whole image<br \/>\n    map.fitBounds(bounds);<\/p>\n<p>    \/\/ Optional: Add a marker or other elements to the map<br \/>\n    var marker = L.marker([500, 500]).addTo(map)<br \/>\n      .bindPopup(&#8216;Center of the image&#8217;)<br \/>\n      .openPopup();<br \/>\n  &lt;\/script&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 1000 x 1000 \u067e\u06cc\u06a9\u0633\u0644 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u06cc\u0645\u060c \u0633\u067e\u0633 \u0646\u0634\u0627\u0646\u06af\u0631 \u0645\u0631\u06a9\u0632\u06cc \u0631\u0627 \u062f\u0631 500, 500.<\/p>\n<p>\u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0633\u067e\u0633 Deploy>Test Deployments\u060c \u0628\u0631\u0627\u06cc \u0645\u0634\u0627\u0647\u062f\u0647 \u0646\u0648\u0639 \u0646\u0642\u0634\u0647 \u062c\u062f\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0646\u0642\u0634\u0647 \u0627\u06cc \u0628\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0648 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u062f\u0631 \u0645\u0631\u06a9\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>  \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u0642\u0634\u0647 \u0628\u0627 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc Google Sheets<\/p>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u0631\u06af\u0647 \u0628\u0631\u0627\u06cc \u067e\u0631 \u06a9\u0631\u062f\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0627\u0632 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u06a9\u0627\u0646 \u0647\u0627\u06cc \u0646\u0634\u0627\u0646\u06af\u0631 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f:<\/p>\n<p>function getPinData(){<br \/>\n  const ss = SpreadsheetApp.getActiveSpreadsheet();<br \/>\n  const sh = ss.getSheetByName(&#8216;map_pin&#8217;);<br \/>\n  const data = sh.getDataRange().getValues();<br \/>\n  const json = arrayToJSON(data);<br \/>\n  \/\/Logger.log(json);<br \/>\n  return json<br \/>\n}<\/p>\n<p>function arrayToJSON(data=getPinData()){<br \/>\n  const headers = data[0];<br \/>\n  const rows = data.slice(1);<br \/>\n  let jsonData = [];<br \/>\n  for(row of rows){<br \/>\n    const obj = {};<br \/>\n    headers.forEach((h,i)=&gt;obj[h] = row[i]);<br \/>\n    jsonData.push(obj)<br \/>\n  }<br \/>\n  \/\/Logger.log(jsonData)<br \/>\n  return jsonData<br \/>\n}<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0646 \u067e\u06cc\u0646\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 JSON \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u0628\u0627 \u0622\u0646\u0647\u0627 \u062f\u0631 HTML \u062f\u0631 \u0628\u062e\u0634 \u0628\u0639\u062f\u06cc \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 HTML \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0631\u0648\u06cc \u0627\u06cc\u0646 JSON \u062d\u0644\u0642\u0647 \u0628\u0632\u0646\u062f \u0648 \u067e\u0633 \u0627\u0632 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0646\u0642\u0634\u0647\u060c \u067e\u06cc\u0646 \u0647\u0627\u06cc \u0646\u0642\u0634\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\/\/ Add map pins from sheet data<br \/>\n    google.script.run.withSuccessHandler(addMarkers).getPinData();<\/p>\n<p>    function addMarkers(mapPinData) {<br \/>\n      mapPinData.forEach(pin =&gt; {<br \/>\n        const marker = L.marker([pin.x, pin.y], {<br \/>\n          draggable: true<br \/>\n        }).addTo(map);<\/p>\n<p>        marker.bindPopup(`&lt;b&gt;${pin.title}`).openPopup();<\/p>\n<p>        marker.on(&#8216;dragend&#8217;, function(e) {<br \/>\n          const latLng = e.target.getLatLng();<br \/>\n          console.log(`Marker ${pin.title} moved to: ${latLng.lat}, ${latLng.lng}`);<br \/>\n        });<br \/>\n      });<br \/>\n    }<\/p>\n<p>\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0628\u0631\u0646\u0627\u0645\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627\u06cc\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u0631\u06af\u0647 \u0634\u0645\u0627 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u0634\u0648\u0646\u062f!<\/p>\n<p>\u0647\u0631 \u067e\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 \u0628\u0627 \u0639\u0646\u0648\u0627\u0646 \u0622\u0646 \u0631\u062f\u06cc\u0641 \u0627\u0633\u062a. \u067e\u06cc\u0646 \u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0642\u0627\u0628\u0644 \u06a9\u0634\u06cc\u062f\u0646 \u0647\u0633\u062a\u0646\u062f\u060c \u0627\u0645\u0627 \u0645\u0627 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n<p>  \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u0646\u0634\u0627\u0646\u06af\u0631 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0634\u06cc\u062f\u0646<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f\u060c \u0628\u0647 \u062f\u0648 \u062a\u0627\u0628\u0639 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645: \u06cc\u06a9\u06cc \u062f\u0631 HTML \u0628\u0631\u0627\u06cc \u062b\u0628\u062a \u0631\u0648\u06cc\u062f\u0627\u062f \u062f\u0631 \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc\u060c \u0648 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f \u062f\u0631 \u0633\u0645\u062a \u0633\u0631\u0648\u0631\u060c \u062f\u0631 \u0641\u0627\u06cc\u0644 Code.gs.<\/p>\n<p>\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc HTML \u0628\u0627:<\/p>\n<p>    function addMarkers(mapPinData) {<br \/>\n      mapPinData.forEach(pin =&gt; {<br \/>\n        const { id, title, x, y } = pin;<br \/>\n        const marker = L.marker([x, y], {<br \/>\n          draggable: true<br \/>\n        }).addTo(map);<\/p>\n<p>        marker.bindPopup(`&lt;b&gt;${title}&lt;\/b&gt;`).openPopup();<\/p>\n<p>        marker.on(&#8216;dragend&#8217;, function(e) {<br \/>\n          const latLng = e.target.getLatLng();<br \/>\n          console.log(`Marker ${title} moved to: ${latLng.lat}, ${latLng.lng}`);<br \/>\n          saveMarkerPosition({ id, title, lat: latLng.lat, lng: latLng.lng });<br \/>\n        });<br \/>\n      });<br \/>\n    }<\/p>\n<p>    function saveMarkerPosition({ id, title, lat, lng }) {<br \/>\n      google.script.run.saveMarkerPosition({ id, title, lat, lng });<br \/>\n    }<\/p>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u06a9\u0627\u0646 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>function saveMarkerPosition({ id, lat, lng }) {<br \/>\n  const ss = SpreadsheetApp.getActiveSpreadsheet();<br \/>\n  const sh = ss.getSheetByName(&#8216;map_pin&#8217;);<br \/>\n  const data = sh.getDataRange().getValues();<\/p>\n<p>  for (let i = 1; i &lt; data.length; i++) {<br \/>\n    if (data[i][0] === id) {  \/\/ ID column (index 0)<br \/>\n      sh.getRange(i + 1, 3).setValue(lat);  \/\/ latitude column<br \/>\n      sh.getRange(i + 1, 4).setValue(lng);  \/\/ longitude column<br \/>\n      break;<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<p>\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0647\u0646\u06af\u0627\u0645 \u06a9\u0634\u06cc\u062f\u0646 \u0646\u0634\u0627\u0646\u06af\u0631\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0631\u06af\u0647 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f!<\/p>\n<p>  \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0645\u062a\u06cc\u0627\u0632\u0627\u062a \u062c\u062f\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0646\u0642\u0627\u0637 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0627\u0628\u0647\u200c\u062c\u0627 \u06a9\u0646\u06cc\u0645\u060c \u0627\u0645\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0646\u0642\u0627\u0637 \u062c\u062f\u06cc\u062f \u0686\u0637\u0648\u0631\u061f \u0628\u0627\u0632 \u0647\u0645 \u0628\u0647 \u062f\u0648 \u062a\u0627\u0628\u0639 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u060c \u06cc\u06a9\u06cc \u062f\u0631 HTML \u0648 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u0641\u0627\u06cc\u0644 Code.gs.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 HTML \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648\u06cc \u0646\u0642\u0637\u0647 \u062e\u0627\u0644\u06cc \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u062f\u060c \u06cc\u06a9 \u0641\u0631\u0645\u0627\u0646 \u0628\u0627\u0632 \u0634\u0648\u062f \u0648 \u0645\u0642\u062f\u0627\u0631 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0633\u0631\u0648\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>    \/\/ Function to add a new pin<br \/>\n    map.on(&#8216;click&#8217;, function(e) {<br \/>\n      const latLng = e.latlng;<br \/>\n      const title = prompt(&#8216;Enter a title for the new pin:&#8217;);<br \/>\n      if (title) {<br \/>\n        google.script.run.withSuccessHandler(function(id) {<br \/>\n          addNewMarker({ id, title, lat: latLng.lat, lng: latLng.lng });<br \/>\n        }).addNewPin({ title, lat: latLng.lat, lng: latLng.lng });<br \/>\n      }<br \/>\n    });<\/p>\n<p>    function addNewMarker({ id, title, lat, lng }) {<br \/>\n      const marker = L.marker([lat, lng], {<br \/>\n        draggable: true<br \/>\n      }).addTo(map);<\/p>\n<p>      marker.bindPopup(`&lt;b&gt;${title}&lt;\/b&gt;`).openPopup();<\/p>\n<p>      marker.on(&#8216;dragend&#8217;, function(e) {<br \/>\n        const latLng = e.target.getLatLng();<br \/>\n        saveMarkerPosition({ id, title, lat: latLng.lat, lng: latLng.lng });<br \/>\n      });<br \/>\n    }<\/p>\n<p>\u0633\u067e\u0633 \u062a\u0627\u0628\u0639 \u0631\u0627 \u0628\u0647 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0631\u062f\u06cc\u0641 \u062c\u062f\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u0634\u0648\u062f.<\/p>\n<p>function addNewPin({ title, lat, lng }) {<br \/>\n  const ss = SpreadsheetApp.getActiveSpreadsheet();<br \/>\n  const sh = ss.getSheetByName(&#8216;map_pin&#8217;);<\/p>\n<p>  \/\/ Check if there are any rows present, if not initialize ID<br \/>\n  const lastRow = sh.getLastRow();<br \/>\n  let newId = 1;<\/p>\n<p>  if (lastRow &gt; 0) {<br \/>\n    const lastId = sh.getRange(lastRow, 1).getValue();<br \/>\n    newId = lastId + 1;<br \/>\n  }<\/p>\n<p>  sh.appendRow([newId, title, lat, lng]);<\/p>\n<p>  return newId;<br \/>\n}<\/p>\n<p>\u06cc\u06a9 \u0628\u0627\u0631 \u062f\u06cc\u06af\u0631 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0627\u0632\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u062d\u0627\u0644\u0627 \u0648\u0642\u062a\u06cc \u0631\u0648\u06cc \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u062e\u0627\u0644\u06cc \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0646\u0648\u0627\u0646\u06cc \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u062c\u062f\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f!<\/p>\n<p>  \u062d\u0630\u0641 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631<\/p>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0628\u0627\u06cc\u062f \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0645\u0644 CRUD \u062f\u0631 \u0646\u0645\u0627\u06cc \u0646\u0642\u0634\u0647 \u0628\u0647 \u0645\u0627 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u062a\u0627\u0628\u0639 \u0627\u0641\u0632\u0648\u062f\u0646 \u0646\u0634\u0627\u0646\u06af\u0631 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0647 \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 \u062f\u06a9\u0645\u0647 \u062d\u0630\u0641 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f:<\/p>\n<p>      const popupContent = `&lt;b&gt;${title}&lt;\/b&gt;&lt;br&gt;&lt;button onclick=&#8221;deleteMarker(${id})&#8221;&gt;Delete Marker&lt;\/button&gt;`;<br \/>\n      marker.bindPopup(popupContent).openPopup();<\/p>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u0627\u0632 \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ Function to delete a marker<br \/>\n  function deleteMarker(id) {<br \/>\n    const confirmed = confirm(&#8216;Are you sure you want to delete this marker?&#8217;);<br \/>\n    if (confirmed) {<br \/>\n      google.script.run.withSuccessHandler(() =&gt; {<br \/>\n        \/\/ Refresh the markers after deletion<br \/>\n        google.script.run.withSuccessHandler(addMarkers).getPinData();<br \/>\n      }).deleteMarker(id);<br \/>\n    }<br \/>\n  }<\/p>\n<p>\u0633\u067e\u0633 \u062a\u0627\u0628\u0639 \u0645\u0637\u0627\u0628\u0642 \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>function deleteMarker(id) {<br \/>\n  const ss = SpreadsheetApp.getActiveSpreadsheet();<br \/>\n  const sh = ss.getSheetByName(&#8216;map_pin&#8217;);<br \/>\n  const data = sh.getDataRange().getValues();<\/p>\n<p>  for (let i = 1; i &lt; data.length; i++) {<br \/>\n    if (data[i][0] === id) {  \/\/ ID column (index 0)<br \/>\n      sh.deleteRow(i + 1);  \/\/ Delete the row<br \/>\n      break;<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<p>  \u0628\u0639\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f\u061f<\/p>\n<p>\u0627\u0632 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0627\u0631\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u0641\u0632\u0648\u062f\u0646 \u0633\u0627\u06cc\u0631 \u0646\u0642\u0627\u0637 \u062f\u0627\u062f\u0647 \u0628\u0647 \u0647\u0631 \u0646\u0634\u0627\u0646\u06af\u0631\u060c \u062a\u0635\u0627\u0648\u06cc\u0631 \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u067e\u0648\u06cc\u0627\u060c \u06cc\u0627 \u0633\u0627\u06cc\u0631 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u0644\u06cc\u06a9 \u0648 \u06a9\u0634\u06cc\u062f\u0646. \u0634\u0645\u0627 \u062d\u062a\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0628\u0633\u0627\u0632\u06cc\u062f! \u0627\u06cc\u062f\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0627\u0631\u06cc\u062f\u061f \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0638\u0631 \u0628\u062f\u0647\u06cc\u062f!<\/p>\n<p>Google Maps \u062f\u0627\u0631\u0627\u06cc \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u062a\u0631\u0633\u06cc\u0645 \u0646\u0642\u0627\u0637 \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u0642\u0627\u0637 \u0631\u0627 \u062a\u0631\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f <em>\u0631\u0648\u06cc \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631<\/em>? \u0627\u06cc\u0646 \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc XY Image Plot \u0645\u0639\u0645\u0648\u0644\u0627 \u0628\u0631\u0627\u06cc \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc \u0637\u0628\u0642\u0647\u060c \u0628\u0627\u0632\u0631\u0633\u06cc \u0645\u062d\u0644 \u06a9\u0627\u0631 \u0648 \u062d\u062a\u06cc \u0628\u0627\u0632\u06cc \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u060c \u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u062a\u0639\u0627\u0645\u0644\u06cc \u0628\u0627 \u0646\u0642\u0627\u0637 \u0642\u0627\u0628\u0644 \u06a9\u0634\u06cc\u062f\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Leaflet.js \u0648 Google Apps Script \u0631\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u0645 \u062f\u0627\u062f. \u0645\u0627 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0627\u0632 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u0642\u0634\u0647 \u06af\u0631\u0641\u062a\u0647 \u062a\u0627 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0627\u0632 Google Sheets \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0646 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f.<\/p>\n<p><strong>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Leaflet.js \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 HTML \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps<\/p>\n<\/li>\n<li>\n<p>\u0646\u0645\u0627\u06cc\u0634 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc Google Sheets<\/p>\n<\/li>\n<li>\n<p>\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0631\u062f\u06cc\u0641 \u0628\u0631\u06af\u0647\u200c\u0647\u0627 \u0647\u0646\u06af\u0627\u0645 \u062c\u0627\u0628\u062c\u0627\u06cc\u06cc \u0646\u0634\u0627\u0646\u06af\u0631<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u0632 \u0646\u0642\u0634\u0647 \u0648 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0631 Sheets<\/p>\n<\/li>\n<li>\n<p>\u062d\u0630\u0641 \u0646\u0634\u0627\u0646\u06af\u0631 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628<\/p>\n<\/li>\n<\/ul>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Leafletjs_%D8%AF%D8%B1_%D8%B3%D8%B1%D9%88%DB%8C%D8%B3_HTML_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_Google_Apps\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Leaflet.js \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 HTML \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%B1%D8%A7%D9%87%E2%80%8C%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DA%AF%E2%80%8C%D9%86%DA%AF%D8%A7%D8%B1_Google\" >\u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0627\u0631\u0628\u0631\u06af\u200c\u0646\u06af\u0627\u0631 Google<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D9%81%D8%A7%DB%8C%D9%84_HTML\" >\u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 HTML<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%B1%D8%A7%D9%87%E2%80%8C%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%86%D9%82%D8%B4%D9%87_%D8%A8%D8%A7_%D8%AF%D8%A7%D8%AF%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C_Google_Sheets\" >\u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u0642\u0634\u0647 \u0628\u0627 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc Google Sheets<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%B0%D8%AE%DB%8C%D8%B1%D9%87_%D9%85%D9%88%D9%82%D8%B9%DB%8C%D8%AA_%D9%86%D8%B4%D8%A7%D9%86%DA%AF%D8%B1_%D9%87%D9%86%DA%AF%D8%A7%D9%85_%DA%A9%D8%B4%DB%8C%D8%AF%D9%86\" >\u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u0646\u0634\u0627\u0646\u06af\u0631 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0634\u06cc\u062f\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D9%85%D8%AA%DB%8C%D8%A7%D8%B2%D8%A7%D8%AA_%D8%AC%D8%AF%DB%8C%D8%AF\" >\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0645\u062a\u06cc\u0627\u0632\u0627\u062a \u062c\u062f\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%AD%D8%B0%D9%81_%DB%8C%DA%A9_%D9%86%D8%B4%D8%A7%D9%86%DA%AF%D8%B1\" >\u062d\u0630\u0641 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/building-an-interactive-xy-image-plot-with-google-apps-script-and-leafletjs-2ooe\/#%D8%A8%D8%B9%D8%AF_%DA%86%D9%87_%D9%85%DB%8C_%D8%B4%D9%88%D8%AF%D8%9F\" >\u0628\u0639\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f\u061f<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_Leafletjs_%D8%AF%D8%B1_%D8%B3%D8%B1%D9%88%DB%8C%D8%B3_HTML_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_Google_Apps\"><\/span>\n<p>  <strong>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc Leaflet.js \u062f\u0631 \u0633\u0631\u0648\u06cc\u0633 HTML \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Google Apps<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Leaflet.js \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628 \u062a\u0631\u06cc\u0646 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0646\u06af\u0627\u0634\u062a \u0645\u062a\u0646 \u0628\u0627\u0632 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0633\u0628\u06a9 \u0648\u0632\u0646\u060c \u0622\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0648 \u062f\u0627\u0631\u0627\u06cc \u0627\u0633\u0646\u0627\u062f \u0639\u0627\u0644\u06cc \u0627\u0633\u062a. \u0622\u0646\u0647\u0627 \u0627\u0632 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0646\u0642\u0634\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 &#8220;CRS.Simple&#8221;\u060c \u06cc\u0627 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0631\u062c\u0639 \u0645\u062e\u062a\u0635\u0627\u062a\u060c \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87%E2%80%8C%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DA%AF%E2%80%8C%D9%86%DA%AF%D8%A7%D8%B1_Google\"><\/span>\n<p>  \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0627\u0631\u0628\u0631\u06af\u200c\u0646\u06af\u0627\u0631 Google<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0628\u0631\u06af\u0647 \u0628\u0647 \u200b\u200b\u0646\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f <code>map_pin<\/code> \u0628\u0627 \u0633\u0627\u062e\u062a\u0627\u0631 \u0632\u06cc\u0631:<\/p>\n<div class=\"table-wrapper-paragraph\">\n<table>\n<thead>\n<tr>\n<th>\u0634\u0646\u0627\u0633\u0647<\/th>\n<th>\u0639\u0646\u0648\u0627\u0646<\/th>\n<th>x<\/th>\n<th>y<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>\u062a\u0633\u062a 1<\/td>\n<td>10<\/td>\n<td>30<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u062a\u0633\u062a 2<\/td>\n<td>50<\/td>\n<td>80<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\u0633\u067e\u0633 Apps Script \u0631\u0627 \u0627\u0632 \u0645\u0646\u0648\u06cc Extensions \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D9%81%D8%A7%DB%8C%D9%84_HTML\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 HTML<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u0645\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0627\u0635\u0644\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f Leaflet \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06a9\u0627\u0631 \u06a9\u0646\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062b\u0627\u0644 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u062f\u0631 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u0634\u0631\u0648\u0639 \u0633\u0631\u06cc\u0639 \u0622\u0646\u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 HTML \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 Index \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u062d\u062a\u0648\u0627 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"nt\">&lt;html&gt;<\/span>\n<span class=\"nt\">&lt;head&gt;<\/span>\n  <span class=\"nt\">&lt;title&gt;<\/span>Quick Start - Leaflet<span class=\"nt\">&lt;\/title&gt;<\/span>\n  <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"utf-8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\n  <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"viewport\"<\/span> <span class=\"na\">content=<\/span><span class=\"s\">\"width=device-width, initial-scale=1.0\"<\/span><span class=\"nt\">&gt;<\/span>\n  <span class=\"nt\">&lt;link<\/span> <span class=\"na\">rel=<\/span><span class=\"s\">\"stylesheet\"<\/span> <span class=\"na\">href=<\/span><span class=\"s\">\"https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.css\"<\/span> <span class=\"nt\">\/&gt;<\/span>\n  <span class=\"nt\">&lt;style&gt;<\/span>\n    <span class=\"nf\">#map<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nl\">height<\/span><span class=\"p\">:<\/span> <span class=\"m\">400px<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"nt\">&lt;\/style&gt;<\/span>\n<span class=\"nt\">&lt;\/head&gt;<\/span>\n<span class=\"nt\">&lt;body&gt;<\/span>\n  <span class=\"nt\">&lt;div<\/span> <span class=\"na\">id=<\/span><span class=\"s\">\"map\"<\/span><span class=\"nt\">&gt;&lt;\/div&gt;<\/span>\n\n  <span class=\"nt\">&lt;script <\/span><span class=\"na\">src=<\/span><span class=\"s\">\"https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.js\"<\/span><span class=\"nt\">&gt;&lt;\/script&gt;<\/span>\n  <span class=\"nt\">&lt;script&gt;<\/span>\n    <span class=\"kd\">var<\/span> <span class=\"nx\">map<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nf\">setView<\/span><span class=\"p\">([<\/span><span class=\"mf\">40.73<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mf\">73.99<\/span><span class=\"p\">],<\/span> <span class=\"mi\">13<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">tileLayer<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">maxZoom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">19<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">attribution<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\u00a9 OpenStreetMap<\/span><span class=\"dl\">'<\/span>\n    <span class=\"p\">}).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">var<\/span> <span class=\"nx\">marker<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">marker<\/span><span class=\"p\">([<\/span><span class=\"mf\">40.73<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mf\">73.99<\/span><span class=\"p\">]).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Test Popup Message<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n  <span class=\"nt\">&lt;\/script&gt;<\/span>\n<span class=\"nt\">&lt;\/body&gt;<\/span>\n<span class=\"nt\">&lt;\/html&gt;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0633\u067e\u0633 \u0641\u0627\u06cc\u0644 Code.gs \u0631\u0627 \u0628\u0627:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">doGet<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">html<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">HtmlService<\/span><span class=\"p\">.<\/span><span class=\"nf\">createHtmlOutputFromFile<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Index<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">setTitle<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Map with Draggable Points<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">setXFrameOptionsMode<\/span><span class=\"p\">(<\/span><span class=\"nx\">HtmlService<\/span><span class=\"p\">.<\/span><span class=\"nx\">XFrameOptionsMode<\/span><span class=\"p\">.<\/span><span class=\"nx\">ALLOWALL<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">html<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0631\u0648\u06cc Deploy \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u0646\u062a\u0634\u0631 \u06a9\u0646\u06cc\u062f. \u0633\u067e\u0633 \u067e\u06cc\u0648\u0646\u062f \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062c\u062f\u06cc\u062f \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627\u06cc\u062f Leaflet.js \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0646\u0645\u0627\u06cc\u0634 \u06cc\u06a9 \u0646\u0642\u0634\u0647 \u062f\u0631 \u0646\u06cc\u0648\u06cc\u0648\u0631\u06a9 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p><\/p>\n<p>\u062e\u0648\u0628\u060c \u0627\u06cc\u0646 \u0646\u0645\u0648\u0646\u0647 \u0646\u0642\u0634\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Leaflet \u0627\u0633\u062a. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0633\u0631\u0627\u063a \u0646\u0648\u0639 \u0646\u0642\u0634\u0647 CRS.Simple \u0645\u06cc \u0631\u0648\u06cc\u0645 \u06a9\u0647 \u0627\u0645\u06a9\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>HTML \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0627\u0632 Leaflet Tutorials \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"nt\">&lt;html&gt;<\/span>\n<span class=\"nt\">&lt;head&gt;<\/span>\n  <span class=\"nt\">&lt;title&gt;<\/span>CRS Simple Example - Leaflet<span class=\"nt\">&lt;\/title&gt;<\/span>\n  <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">charset=<\/span><span class=\"s\">\"utf-8\"<\/span> <span class=\"nt\">\/&gt;<\/span>\n  <span class=\"nt\">&lt;meta<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"viewport\"<\/span> <span class=\"na\">content=<\/span><span class=\"s\">\"width=device-width, initial-scale=1.0\"<\/span><span class=\"nt\">&gt;<\/span>\n  <span class=\"nt\">&lt;link<\/span> <span class=\"na\">rel=<\/span><span class=\"s\">\"stylesheet\"<\/span> <span class=\"na\">href=<\/span><span class=\"s\">\"https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.css\"<\/span> <span class=\"nt\">\/&gt;<\/span>\n  <span class=\"nt\">&lt;style&gt;<\/span>\n    <span class=\"nf\">#map<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nl\">height<\/span><span class=\"p\">:<\/span> <span class=\"m\">400px<\/span><span class=\"p\">;<\/span>\n      <span class=\"nl\">width<\/span><span class=\"p\">:<\/span> <span class=\"m\">600px<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"nt\">body<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nl\">margin<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n      <span class=\"nl\">padding<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"nt\">&lt;\/style&gt;<\/span>\n<span class=\"nt\">&lt;\/head&gt;<\/span>\n<span class=\"nt\">&lt;body&gt;<\/span>\n  <span class=\"nt\">&lt;div<\/span> <span class=\"na\">id=<\/span><span class=\"s\">\"map\"<\/span><span class=\"nt\">&gt;&lt;\/div&gt;<\/span>\n\n  <span class=\"nt\">&lt;script <\/span><span class=\"na\">src=<\/span><span class=\"s\">\"https:\/\/unpkg.com\/leaflet@1.9.3\/dist\/leaflet.js\"<\/span><span class=\"nt\">&gt;&lt;\/script&gt;<\/span>\n  <span class=\"nt\">&lt;script&gt;<\/span>\n    <span class=\"c1\">\/\/ Set up the map with a simple CRS (no geographic projection)<\/span>\n    <span class=\"kd\">var<\/span> <span class=\"nx\">map<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">crs<\/span><span class=\"p\">:<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nx\">CRS<\/span><span class=\"p\">.<\/span><span class=\"nx\">Simple<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">minZoom<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">maxZoom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Define the dimensions of the image<\/span>\n    <span class=\"kd\">var<\/span> <span class=\"nx\">bounds<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">],<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1000<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1000<\/span><span class=\"p\">]];<\/span>\n    <span class=\"kd\">var<\/span> <span class=\"nx\">image<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">imageOverlay<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">https:\/\/leafletjs.com\/examples\/crs-simple\/uqm_map_full.png<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bounds<\/span><span class=\"p\">).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Set the initial view of the map to show the whole image<\/span>\n    <span class=\"nx\">map<\/span><span class=\"p\">.<\/span><span class=\"nf\">fitBounds<\/span><span class=\"p\">(<\/span><span class=\"nx\">bounds<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Optional: Add a marker or other elements to the map<\/span>\n    <span class=\"kd\">var<\/span> <span class=\"nx\">marker<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">marker<\/span><span class=\"p\">([<\/span><span class=\"mi\">500<\/span><span class=\"p\">,<\/span> <span class=\"mi\">500<\/span><span class=\"p\">]).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Center of the image<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n  <span class=\"nt\">&lt;\/script&gt;<\/span>\n<span class=\"nt\">&lt;\/body&gt;<\/span>\n<span class=\"nt\">&lt;\/html&gt;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 1000 x 1000 \u067e\u06cc\u06a9\u0633\u0644 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u06cc\u0645\u060c \u0633\u067e\u0633 \u0646\u0634\u0627\u0646\u06af\u0631 \u0645\u0631\u06a9\u0632\u06cc \u0631\u0627 \u062f\u0631 <code>500, 500<\/code>.<\/p>\n<p>\u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f<\/strong>\u060c \u0633\u067e\u0633 <strong>Deploy>Test Deployments<\/strong>\u060c \u0628\u0631\u0627\u06cc \u0645\u0634\u0627\u0647\u062f\u0647 \u0646\u0648\u0639 \u0646\u0642\u0634\u0647 \u062c\u062f\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0646\u0642\u0634\u0647 \u0627\u06cc \u0628\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0648 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u062f\u0631 \u0645\u0631\u06a9\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3shwx6orgowrdr32wvj3.png\" alt=\"\u0646\u0642\u0634\u0647 \u062c\u0632\u0648\u0647\" width=\"752\" height=\"548\" title=\"\"><\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87%E2%80%8C%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%86%D9%82%D8%B4%D9%87_%D8%A8%D8%A7_%D8%AF%D8%A7%D8%AF%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C_Google_Sheets\"><\/span>\n<p>  <strong>\u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0646\u0642\u0634\u0647 \u0628\u0627 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc Google Sheets<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u0631\u06af\u0647 \u0628\u0631\u0627\u06cc \u067e\u0631 \u06a9\u0631\u062f\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0627\u0632 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u06a9\u0627\u0646 \u0647\u0627\u06cc \u0646\u0634\u0627\u0646\u06af\u0631 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">getPinData<\/span><span class=\"p\">(){<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">ss<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">SpreadsheetApp<\/span><span class=\"p\">.<\/span><span class=\"nf\">getActiveSpreadsheet<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">sh<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ss<\/span><span class=\"p\">.<\/span><span class=\"nf\">getSheetByName<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map_pin<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getDataRange<\/span><span class=\"p\">().<\/span><span class=\"nf\">getValues<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">json<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">arrayToJSON<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">);<\/span>\n  <span class=\"c1\">\/\/Logger.log(json);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">json<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">arrayToJSON<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"o\">=<\/span><span class=\"nf\">getPinData<\/span><span class=\"p\">()){<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">headers<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">rows<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">jsonData<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\n  <span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"nx\">row<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">rows<\/span><span class=\"p\">){<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">obj<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{};<\/span>\n    <span class=\"nx\">headers<\/span><span class=\"p\">.<\/span><span class=\"nf\">forEach<\/span><span class=\"p\">((<\/span><span class=\"nx\">h<\/span><span class=\"p\">,<\/span><span class=\"nx\">i<\/span><span class=\"p\">)<\/span><span class=\"o\">=&gt;<\/span><span class=\"nx\">obj<\/span><span class=\"p\">[<\/span><span class=\"nx\">h<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">row<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">]);<\/span>\n    <span class=\"nx\">jsonData<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"nx\">obj<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"c1\">\/\/Logger.log(jsonData)<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">jsonData<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0646 \u067e\u06cc\u0646\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 JSON \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u0628\u0627 \u0622\u0646\u0647\u0627 \u062f\u0631 HTML \u062f\u0631 \u0628\u062e\u0634 \u0628\u0639\u062f\u06cc \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 HTML \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0631\u0648\u06cc \u0627\u06cc\u0646 JSON \u062d\u0644\u0642\u0647 \u0628\u0632\u0646\u062f \u0648 \u067e\u0633 \u0627\u0632 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0646\u0642\u0634\u0647\u060c \u067e\u06cc\u0646 \u0647\u0627\u06cc \u0646\u0642\u0634\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ Add map pins from sheet data<\/span>\n    <span class=\"nx\">google<\/span><span class=\"p\">.<\/span><span class=\"nx\">script<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">.<\/span><span class=\"nf\">withSuccessHandler<\/span><span class=\"p\">(<\/span><span class=\"nx\">addMarkers<\/span><span class=\"p\">).<\/span><span class=\"nf\">getPinData<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"kd\">function<\/span> <span class=\"nf\">addMarkers<\/span><span class=\"p\">(<\/span><span class=\"nx\">mapPinData<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">mapPinData<\/span><span class=\"p\">.<\/span><span class=\"nf\">forEach<\/span><span class=\"p\">(<\/span><span class=\"nx\">pin<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">marker<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">marker<\/span><span class=\"p\">([<\/span><span class=\"nx\">pin<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pin<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">],<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">draggable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\n        <span class=\"p\">}).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"s2\">`&lt;b&gt;<\/span><span class=\"p\">${<\/span><span class=\"nx\">pin<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">).<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">dragend<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">latLng<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLatLng<\/span><span class=\"p\">();<\/span>\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Marker <\/span><span class=\"p\">${<\/span><span class=\"nx\">pin<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\"> moved to: <\/span><span class=\"p\">${<\/span><span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0628\u0631\u0646\u0627\u0645\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627\u06cc\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u0631\u06af\u0647 \u0634\u0645\u0627 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u0634\u0648\u0646\u062f!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeht71l7mucb2yn41t9a.png\" alt=\"\u0646\u0642\u0634\u0647 \u062c\u0632\u0648\u0647\" width=\"752\" height=\"548\" title=\"\"><\/p>\n<p>\u0647\u0631 \u067e\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 \u0628\u0627 \u0639\u0646\u0648\u0627\u0646 \u0622\u0646 \u0631\u062f\u06cc\u0641 \u0627\u0633\u062a. \u067e\u06cc\u0646 \u0647\u0627 \u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0642\u0627\u0628\u0644 \u06a9\u0634\u06cc\u062f\u0646 \u0647\u0633\u062a\u0646\u062f\u060c \u0627\u0645\u0627 \u0645\u0627 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B0%D8%AE%DB%8C%D8%B1%D9%87_%D9%85%D9%88%D9%82%D8%B9%DB%8C%D8%AA_%D9%86%D8%B4%D8%A7%D9%86%DA%AF%D8%B1_%D9%87%D9%86%DA%AF%D8%A7%D9%85_%DA%A9%D8%B4%DB%8C%D8%AF%D9%86\"><\/span>\n<p>  \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u0646\u0634\u0627\u0646\u06af\u0631 \u0647\u0646\u06af\u0627\u0645 \u06a9\u0634\u06cc\u062f\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f\u060c \u0628\u0647 \u062f\u0648 \u062a\u0627\u0628\u0639 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645: \u06cc\u06a9\u06cc \u062f\u0631 HTML \u0628\u0631\u0627\u06cc \u062b\u0628\u062a \u0631\u0648\u06cc\u062f\u0627\u062f \u062f\u0631 \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc\u060c \u0648 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u062c\u062f\u06cc\u062f \u062f\u0631 \u0633\u0645\u062a \u0633\u0631\u0648\u0631\u060c \u062f\u0631 \u0641\u0627\u06cc\u0644 Code.gs.<\/p>\n<p>\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc HTML \u0628\u0627:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"kd\">function<\/span> <span class=\"nf\">addMarkers<\/span><span class=\"p\">(<\/span><span class=\"nx\">mapPinData<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">mapPinData<\/span><span class=\"p\">.<\/span><span class=\"nf\">forEach<\/span><span class=\"p\">(<\/span><span class=\"nx\">pin<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">pin<\/span><span class=\"p\">;<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">marker<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">marker<\/span><span class=\"p\">([<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">],<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">draggable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\n        <span class=\"p\">}).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"s2\">`&lt;b&gt;<\/span><span class=\"p\">${<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\">&lt;\/b&gt;`<\/span><span class=\"p\">).<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">dragend<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">latLng<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLatLng<\/span><span class=\"p\">();<\/span>\n          <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Marker <\/span><span class=\"p\">${<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\"> moved to: <\/span><span class=\"p\">${<\/span><span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n          <span class=\"nf\">saveMarkerPosition<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"na\">lat<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"na\">lng<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span> <span class=\"p\">});<\/span>\n        <span class=\"p\">});<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">function<\/span> <span class=\"nf\">saveMarkerPosition<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">google<\/span><span class=\"p\">.<\/span><span class=\"nx\">script<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">.<\/span><span class=\"nf\">saveMarkerPosition<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span> <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u06a9\u0627\u0646 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">saveMarkerPosition<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">ss<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">SpreadsheetApp<\/span><span class=\"p\">.<\/span><span class=\"nf\">getActiveSpreadsheet<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">sh<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ss<\/span><span class=\"p\">.<\/span><span class=\"nf\">getSheetByName<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map_pin<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getDataRange<\/span><span class=\"p\">().<\/span><span class=\"nf\">getValues<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">let<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span><span class=\"o\">++<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">][<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>  <span class=\"c1\">\/\/ ID column (index 0)<\/span>\n      <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRange<\/span><span class=\"p\">(<\/span><span class=\"nx\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">).<\/span><span class=\"nf\">setValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">lat<\/span><span class=\"p\">);<\/span>  <span class=\"c1\">\/\/ latitude column<\/span>\n      <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRange<\/span><span class=\"p\">(<\/span><span class=\"nx\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">).<\/span><span class=\"nf\">setValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">lng<\/span><span class=\"p\">);<\/span>  <span class=\"c1\">\/\/ longitude column<\/span>\n      <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f \u0647\u0646\u06af\u0627\u0645 \u06a9\u0634\u06cc\u062f\u0646 \u0646\u0634\u0627\u0646\u06af\u0631\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0631\u06af\u0647 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwis4iaaupd8sc8cogmwm.gif\" alt=\"\u0646\u0642\u0634\u0647 \u062c\u0632\u0648\u0647\" width=\"1496\" height=\"706\" title=\"\"><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D9%85%D8%AA%DB%8C%D8%A7%D8%B2%D8%A7%D8%AA_%D8%AC%D8%AF%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0645\u062a\u06cc\u0627\u0632\u0627\u062a \u062c\u062f\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0646\u0642\u0627\u0637 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0627\u0628\u0647\u200c\u062c\u0627 \u06a9\u0646\u06cc\u0645\u060c \u0627\u0645\u0627 \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0646\u0642\u0627\u0637 \u062c\u062f\u06cc\u062f \u0686\u0637\u0648\u0631\u061f \u0628\u0627\u0632 \u0647\u0645 \u0628\u0647 \u062f\u0648 \u062a\u0627\u0628\u0639 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u060c \u06cc\u06a9\u06cc \u062f\u0631 HTML \u0648 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u0641\u0627\u06cc\u0644 Code.gs.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0647 HTML \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0648\u06cc \u0646\u0642\u0637\u0647 \u062e\u0627\u0644\u06cc \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u062f\u060c \u06cc\u06a9 \u0641\u0631\u0645\u0627\u0646 \u0628\u0627\u0632 \u0634\u0648\u062f \u0648 \u0645\u0642\u062f\u0627\u0631 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0633\u0631\u0648\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0646\u06cc\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>    <span class=\"c1\">\/\/ Function to add a new pin<\/span>\n    <span class=\"nx\">map<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">click<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">latLng<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">latlng<\/span><span class=\"p\">;<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">title<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">prompt<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Enter a title for the new pin:<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">title<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">google<\/span><span class=\"p\">.<\/span><span class=\"nx\">script<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">.<\/span><span class=\"nf\">withSuccessHandler<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nf\">addNewMarker<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"na\">lat<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"na\">lng<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span> <span class=\"p\">});<\/span>\n        <span class=\"p\">}).<\/span><span class=\"nf\">addNewPin<\/span><span class=\"p\">({<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"na\">lat<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"na\">lng<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span> <span class=\"p\">});<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"kd\">function<\/span> <span class=\"nf\">addNewMarker<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">marker<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">L<\/span><span class=\"p\">.<\/span><span class=\"nf\">marker<\/span><span class=\"p\">([<\/span><span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span><span class=\"p\">],<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">draggable<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\n      <span class=\"p\">}).<\/span><span class=\"nf\">addTo<\/span><span class=\"p\">(<\/span><span class=\"nx\">map<\/span><span class=\"p\">);<\/span>\n\n      <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"s2\">`&lt;b&gt;<\/span><span class=\"p\">${<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\">&lt;\/b&gt;`<\/span><span class=\"p\">).<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n\n      <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">dragend<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">latLng<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLatLng<\/span><span class=\"p\">();<\/span>\n        <span class=\"nf\">saveMarkerPosition<\/span><span class=\"p\">({<\/span> <span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"na\">lat<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"na\">lng<\/span><span class=\"p\">:<\/span> <span class=\"nx\">latLng<\/span><span class=\"p\">.<\/span><span class=\"nx\">lng<\/span> <span class=\"p\">});<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0633\u067e\u0633 \u062a\u0627\u0628\u0639 \u0631\u0627 \u0628\u0647 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0631\u062f\u06cc\u0641 \u062c\u062f\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u0634\u0648\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">addNewPin<\/span><span class=\"p\">({<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">ss<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">SpreadsheetApp<\/span><span class=\"p\">.<\/span><span class=\"nf\">getActiveSpreadsheet<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">sh<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ss<\/span><span class=\"p\">.<\/span><span class=\"nf\">getSheetByName<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map_pin<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"c1\">\/\/ Check if there are any rows present, if not initialize ID<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">lastRow<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLastRow<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">newId<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">lastRow<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">lastId<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRange<\/span><span class=\"p\">(<\/span><span class=\"nx\">lastRow<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">).<\/span><span class=\"nf\">getValue<\/span><span class=\"p\">();<\/span>\n    <span class=\"nx\">newId<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">lastId<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">appendRow<\/span><span class=\"p\">([<\/span><span class=\"nx\">newId<\/span><span class=\"p\">,<\/span> <span class=\"nx\">title<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lat<\/span><span class=\"p\">,<\/span> <span class=\"nx\">lng<\/span><span class=\"p\">]);<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">newId<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u06cc\u06a9 \u0628\u0627\u0631 \u062f\u06cc\u06af\u0631 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0631\u0627 \u0628\u0627\u0632\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u062d\u0627\u0644\u0627 \u0648\u0642\u062a\u06cc \u0631\u0648\u06cc \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u062e\u0627\u0644\u06cc \u06a9\u0644\u06cc\u06a9 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0639\u0646\u0648\u0627\u0646\u06cc \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u062c\u062f\u06cc\u062f \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvhxmi27dcrgmnp5w18b.png\" alt=\"\u0646\u0642\u0634\u0647 \u062c\u0632\u0648\u0647\" width=\"616\" height=\"453\" title=\"\"><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AD%D8%B0%D9%81_%DB%8C%DA%A9_%D9%86%D8%B4%D8%A7%D9%86%DA%AF%D8%B1\"><\/span>\n<p>  \u062d\u0630\u0641 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0628\u0627\u06cc\u062f \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u0646\u0634\u0627\u0646\u06af\u0631\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0645\u0644 CRUD \u062f\u0631 \u0646\u0645\u0627\u06cc \u0646\u0642\u0634\u0647 \u0628\u0647 \u0645\u0627 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u062a\u0627\u0628\u0639 \u0627\u0641\u0632\u0648\u062f\u0646 \u0646\u0634\u0627\u0646\u06af\u0631 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0647 \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 \u062f\u06a9\u0645\u0647 \u062d\u0630\u0641 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">popupContent<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`&lt;b&gt;<\/span><span class=\"p\">${<\/span><span class=\"nx\">title<\/span><span class=\"p\">}<\/span><span class=\"s2\">&lt;\/b&gt;&lt;br&gt;&lt;button onclick=\"deleteMarker(<\/span><span class=\"p\">${<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\">)\"&gt;Delete Marker&lt;\/button&gt;`<\/span><span class=\"p\">;<\/span>\n      <span class=\"nx\">marker<\/span><span class=\"p\">.<\/span><span class=\"nf\">bindPopup<\/span><span class=\"p\">(<\/span><span class=\"nx\">popupContent<\/span><span class=\"p\">).<\/span><span class=\"nf\">openPopup<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u062d\u0630\u0641 \u0627\u0632 \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ Function to delete a marker<\/span>\n  <span class=\"kd\">function<\/span> <span class=\"nf\">deleteMarker<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">confirmed<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">confirm<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Are you sure you want to delete this marker?<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">confirmed<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">google<\/span><span class=\"p\">.<\/span><span class=\"nx\">script<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">.<\/span><span class=\"nf\">withSuccessHandler<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Refresh the markers after deletion<\/span>\n        <span class=\"nx\">google<\/span><span class=\"p\">.<\/span><span class=\"nx\">script<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">.<\/span><span class=\"nf\">withSuccessHandler<\/span><span class=\"p\">(<\/span><span class=\"nx\">addMarkers<\/span><span class=\"p\">).<\/span><span class=\"nf\">getPinData<\/span><span class=\"p\">();<\/span>\n      <span class=\"p\">}).<\/span><span class=\"nf\">deleteMarker<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0633\u067e\u0633 \u062a\u0627\u0628\u0639 \u0645\u0637\u0627\u0628\u0642 \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 Code.gs \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">deleteMarker<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">ss<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">SpreadsheetApp<\/span><span class=\"p\">.<\/span><span class=\"nf\">getActiveSpreadsheet<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">sh<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ss<\/span><span class=\"p\">.<\/span><span class=\"nf\">getSheetByName<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">map_pin<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">data<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">getDataRange<\/span><span class=\"p\">().<\/span><span class=\"nf\">getValues<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">let<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span><span class=\"o\">++<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">][<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>  <span class=\"c1\">\/\/ ID column (index 0)<\/span>\n      <span class=\"nx\">sh<\/span><span class=\"p\">.<\/span><span class=\"nf\">deleteRow<\/span><span class=\"p\">(<\/span><span class=\"nx\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>  <span class=\"c1\">\/\/ Delete the row<\/span>\n      <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B9%D8%AF_%DA%86%D9%87_%D9%85%DB%8C_%D8%B4%D9%88%D8%AF%D8%9F\"><\/span>\n<p>  \u0628\u0639\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0632 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0627\u0631\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u0641\u0632\u0648\u062f\u0646 \u0633\u0627\u06cc\u0631 \u0646\u0642\u0627\u0637 \u062f\u0627\u062f\u0647 \u0628\u0647 \u0647\u0631 \u0646\u0634\u0627\u0646\u06af\u0631\u060c \u062a\u0635\u0627\u0648\u06cc\u0631 \u067e\u0633\u200c\u0632\u0645\u06cc\u0646\u0647 \u067e\u0648\u06cc\u0627\u060c \u06cc\u0627 \u0633\u0627\u06cc\u0631 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u0644\u06cc\u06a9 \u0648 \u06a9\u0634\u06cc\u062f\u0646. \u0634\u0645\u0627 \u062d\u062a\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0628\u0627\u0632\u06cc \u0628\u0633\u0627\u0632\u06cc\u062f! \u0627\u06cc\u062f\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0627\u0631\u06cc\u062f\u061f \u062f\u0631 \u0632\u06cc\u0631 \u0646\u0638\u0631 \u0628\u062f\u0647\u06cc\u062f!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang Google Maps \u062f\u0627\u0631\u0627\u06cc \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u062a\u0631\u0633\u06cc\u0645 \u0646\u0642\u0627\u0637 \u0631\u0648\u06cc \u0646\u0642\u0634\u0647 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u0642\u0627\u0637 \u0631\u0627 \u062a\u0631\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u0686\u0647 \u0645\u06cc \u0634\u0648\u062f \u0631\u0648\u06cc \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631? \u0627\u06cc\u0646 \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc XY Image Plot \u0645\u0639\u0645\u0648\u0644\u0627 \u0628\u0631\u0627\u06cc \u0646\u0642\u0634\u0647 \u0647\u0627\u06cc \u0637\u0628\u0642\u0647\u060c \u0628\u0627\u0632\u0631\u0633\u06cc \u0645\u062d\u0644 \u06a9\u0627\u0631 \u0648 \u062d\u062a\u06cc \u0628\u0627\u0632\u06cc \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f. &hellip;<\/p>\n","protected":false},"author":2,"featured_media":76116,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-76115","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=76115"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76115\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/76116"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=76115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=76115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=76115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}