не работает Dynamic Library Import для Maps JavaScript API в App script
Пытаюсь перейти на Dynamic Library Import API (с устаревшего тега script). Пример согласно документации сделал в гугл-таблице на Apps Script В результате ожидается получить гугл-карту в браузере, но получаю ошибку в консоли
userCodeAppPanel:2 Uncaught SyntaxError: Unexpected end of input userCodeAppPanel:6 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'importLibrary') at initMap (userCodeAppPanel:6:39) at userCodeAppPanel:15:1
Но тот же самый код в jsfiddle отрабатывается без ошибок (результат в виде карты отображается).
Предполагаю что чего-то не хватает именно в Apps Script. Прошу помочь понять причину и запустить код на Dynamic Library Import
Ниже привожу код с Apps script:
<!doctype html>
<html>
<head>
<title>Simple Map</title>
<script>
let map;
// initMap is now async
async function initMap() {
// Request libraries when needed, not in the script tag.
const { Map } = await google.maps.importLibrary("maps");
// Short namespaces can be used.
map = new Map(document.getElementById("map"), {
center: { lat: 40.72476, lng: -74.04843 },
zoom: 8,
});
}
initMap();
</script>
</head>
<body>
<div id="map"></div>
<script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
({key: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "weekly"});</script>
<style>
#map {
height: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
background-color: grey;
}
</style>
</body>
</html>
Ответы (1 шт):
Вопрос решен. Решение от Tanaike: Шаги решения:
- исправление URL:
вариант1.
https:\/\/maps.${c}apis.com/maps/api/js?
вариант2. "https://maps.${c}apis.com/maps/api/js?" - изменение структуры кода от Tanaike (рабочий код привожу ниже)
- добавление разрешений АПИ для ключа гугл
Рабочий код от Tanaike:
<!doctype html>
<html>
<head>
<title>Simple Map</title>
<style>
#map {
height: 100%;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
background-color: grey;
}
</style>
<script>
(g => { var h, a, k, p = "The Google Maps JavaScript API", c = "google", l = "importLibrary", q = "__ib__", m = document, b = window; b = b[c] || (b[c] = {}); var d = b.maps || (b.maps = {}), r = new Set, e = new URLSearchParams, u = () => h || (h = new Promise(async (f, n) => { await (a = m.createElement("script")); e.set("libraries", [...r] + ""); for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); e.set("callback", c + ".maps." + q); a.src = `https:\/\/maps.${c}apis.com/maps/api/js?` + e; d[q] = f; a.onerror = () => h = n(Error(p + " could not load.")); a.nonce = m.querySelector("script[nonce]")?.nonce || ""; m.head.append(a) })); d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)) })
({ key: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "weekly" });
</script>
<script>
let map;
console.log('let map');
async function initMap() {
console.log('start initMap');
// Request libraries when needed, not in the script tag.
const { Map } = await google.maps.importLibrary("maps");
// Short namespaces can be used.
map = new Map(document.getElementById("map"), {
center: { lat: 50.397, lng: -70.644 },
zoom: 4
});
}
initMap();
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>