Google Script в новом меню сайта Google: как? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь «установить» скрипт Google в качестве пункта меню на сайте Google (новый сайт Google, а не «классический сайт Google»).

Этот скрипт должен добавить новую строку в электронную таблицу, встроенную в Сайт. Эта электронная таблица (называемая «Каталог») представляет собой Google Sheet, и скрипт (который я хочу запустить с сайта Google) уже установлен в виде связанного скрипта в Sheet и работает при переключении с S Heet.

Сценарий по существу добавляет новую строку внизу моего каталога песен, чтобы создать новую строку для добавления новой песни.

Сценарий, который работает в электронной таблице:

function addSong() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var numRows = sheet.getLastRow()
  sheet.appendRow([numRows+1]);
}

Моя проблема в том, что я не знаю, как получить доступ к скрипту с сайта. Т.е. я не знаю, как ссылаться на скрипт в меню сайта (по URL или как?), Чтобы запустить его.

Я предполагаю, что это работает: у меня есть подстраница в меню «Каталог» на сайте под названием «Добавить песню», и когда я переключаю ее, я хочу, чтобы скрипт запускался и добавлял строку в каталог Лист.

Любая помощь?

1 Ответ

0 голосов
/ 14 января 2019

Обновлено с более чистым примером:

Во-первых, лучший способ получить доступ к вашему GAS-скрипту из других мест - это, вероятно, опубликовать его как веб-приложение. Таким образом, скрипт может быть вызван через опубликованный URL. Основным требованием к веб-приложению является наличие в качестве точки входа функции doGet ().

Я уверен, что вы можете связать новый пункт меню Сайты Google только с другой страницей на этом же сайте. Таким образом, вы не можете вызывать WebApp (через его URL) прямо из меню. Но на этой новой странице Сайтов, к которой ведет вас пункт меню, вы можете:

  • свяжите кнопку сайтов с URL-адресом веб-приложения (если это поможет) или
  • встроить некоторый HTML-код с JavaScript на страницу, которая вызывается при загрузке страницы; немного сложнее, но это означает, что вызов веб-приложения будет автоматизирован.

Код ниже представляет собой простое веб-приложение, которое является связанной функцией на листе. Если вы опубликуете это (Опубликовать >> Развернуть как веб-приложение ...), а затем получите URL-адрес, который можно связать с кнопкой или вызовом со страницы.

function doGet(request){ 
  addSong(request.parameter.song); // Call your own function.   
  var response = {status: "SUCCESS", data: request.parameter.song};  
  // Return the response. 
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); 
}

function addSong(song) {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var numRows = sheet.getLastRow()
  sheet.appendRow([numRows+1,song]);
}

Чтобы использовать кнопку, добавьте в нее следующую ссылку:

https://script.google.com/macros/s/<your web app ref>/exec?song=%22Bohemian%20Rhapsody%22

Приведенный ниже код является примером автоматического вызова WebApp из встроенного HTML-кода на веб-странице сайтов, доступ к которой осуществляется через меню. Существуют и другие способы вызова веб-приложения из JavaScript, но XMLHttpRequest () работает с большинством браузеров.

<!DOCTYPE html>
<html>
<body onload="test('https://script.google.com/macros/s/<your web app ref>/exec?song=StairwaytoHeaven') ;">
<p id="message">? </p>
<script>

function test(url) {
  var XHR = new XMLHttpRequest();
  XHR.onreadystatechange = function() {
    if(XHR.readyState == 4) {
      if(XHR.status == 200) {
        console.log("SUCCESS: status = "+XHR.status);
        document.getElementById("message").innerHTML = XHR.responseText;
        console.log(XHR.responseText);
      } else {
        console.log("FAILURE: status = "+XHR.readystate+" "+XHR.status);
        document.getElementById("message").innerHTML = "Failure";
      }
    }
  }
  XHR.open("GET", url + ((/\?/).test(url) ? "&" : "?") + Date.now()); // Add timestamp to disable caching, if required. 
  XHR.send();
  return;
}

</script>
</body>
</html>
...