【问题标题】:Google Script in New Google Site Menu: How to?新 Google 站点菜单中的 Google 脚本:如何?
【发布时间】:2019-01-14 16:02:47
【问题描述】:

我正在尝试将 Google 脚本作为菜单项“安装”在 Google 站点(新的 Google 站点,而不是“经典 Google 站点”)中。

此脚本应向嵌入在站点中的电子表格添加新行。该电子表格(名为“目录”)是一个 Google 工作表,并且脚本(我想从 Google 站点运行)已经作为绑定脚本安装在工作表中,并且在从 S 切换时工作 。

该脚本本质上是在我的歌曲目录底部添加一个新行来创建一个新行来添加一首新歌曲。

在电子表格中运行的脚本是:

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

我的问题是我不知道如何从站点访问脚本。即,我不知道如何引用站点菜单中的脚本(通过 URL 或什么?)以使其运行。

我设想它的工作方式是,我在站点的“目录”菜单下有一个名为“添加歌曲”的子页面,当我切换它时,我希望脚本运行并在目录中添加一行工作表。

有什么帮助吗?

【问题讨论】:

    标签: javascript google-apps-script google-sites-2016


    【解决方案1】:

    更新为更简洁的示例:

    首先,从其他地方访问 GAS 脚本的最佳方式可能是将其发布为 Web 应用程序。这样,可以通过其发布的 URL 调用脚本。 Web App 的主要要求是它有一个 doGet() 函数作为入口点。

    我很确定您只能将新的 Google 协作平台菜单项与同一站点中的另一个页面相关联。所以你不能直接从菜单调用 WebApp(通过它的 URL)。但是在新的站点页面上,菜单项会将您带到,您可以:

    • 将站点按钮与 Web 应用 URL 相关联(如果有帮助),或者
    • 在页面加载时调用的页面中嵌入一些带有 JavaScript 的 HTML 代码;稍微复杂一点,但这确实意味着对 Web 应用程序的调用将是自动化的。

    下面的代码是一个简单的网络应用程序,它是工作表中的绑定函数。如果您发布此内容(发布 >> 部署为 WebApp...),然后获取 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
    

    下面的代码是从通过菜单访问的站点网页中的嵌入式 HTML 自动调用 WebApp 的示例。还有其他从 JavaScript 调用 Web 应用程序的方法,但 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>
    

    【讨论】:

    • 帮助了很多人。我正在努力让按钮工作。谢谢。
    • 这有点奇怪。这个link 是我的实时WebApp。 1) 会发生什么 a) 如果您单击它,或 b) 在浏览器地址栏中键入它。 2)当你用你的尝试时会发生什么?这里的想法是将 Google 协作平台从循环中剔除,只是证明 Web 应用程序正在运行。
    • 让它工作了,但是在将行添加到工作表之后,我想要做的是在浏览器选项卡中打开工作表,发生的是一个名为“script.googleusercontent.com/macros....etc”的选项卡以“JSON”和标题中的其他内容打开,下面是“成功”和“Hello World”。如何获得我想要的新标签页中的工作表?
    • @BeeTee 您看到的是return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); 发送回浏览器的内容。显示电子表格需要GAS HTML Service 以及客户端和服务器端代码之间的交互。 This may help。或者问一些新问题。如果我的回答解决了您最初的问题,请将其标记为完成。
    • 看到这里,我有一个更根本的问题。当我的电子表格中的原始脚本执行“SpreadsheetApp.getActive()”调用时,该脚本知道该脚本绑定到的电子表格是要操作的电子表格。但是,这个发布的 Web 应用程序脚本没有引用任何特定的工作表,也没有绑定到任何电子表格。然而,它找到了正确的(目录)表并工作。为什么?
    猜你喜欢
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多