运行Google Script Web应用程序后关闭窗口?

时间:2015-01-27 01:18:44

标签: javascript google-apps-script google-sheets

我制作了一个小型网络应用,可在用户点击电子表格中的链接时打开。该链接会将它们带到Web应用程序,从而对电子表格进行更改。 我希望一旦代码完成运行,浏览器窗口就会自动关闭。

function doGet(e){
  // code make changes to spreadsheet

 // here I want browser window to close

  return HtmlService.createHtmlOutput(uniqueid + " is marked complete");
}; 

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

在您提出问题之后我很久才发现您的问题,但如果您或其他任何人正在寻找答案,请尝试以下方法:

要关闭浏览器窗口,请创建一个简单的HTML文件,指示自己关闭指令window.top.close(),如下所示:

关闭Window.html

<!DOCTYPE html>
<html>
    <script>
        window.top.close();
    </script>
</html>

您需要将其作为HTML输出返回,以便在Web App运行时,它在客户端运行(正如Sandy在上一个答案中所述)。在您的方案中,您已经返回HTML输出以通知某些“[uniqueid]标记为完成”,并且假设您不希望在脚本运行后关闭此窗口,否则用户将不会收到提示你有意。这就是为什么您需要将指令window.top.close()保留在提供此警报的同一HTML输出之外的原因。为此,只需逗号分隔两个HTML输出作为两个返回值。

以下是我提出的另外两个文件,用于为您的用例建模解决方案。仅供参考:我在电子邮件中打包了面向用户的HTML,以提供方便的执行点,代码将请求发送电子邮件地址。

<强> Code.gs

function doGet(e){
  // code make changes to spreadsheet
  var ss = SpreadsheetApp.openById([The key for the spreadsheet you wish you modify])
  var sheet = ss.getActiveSheet()
  var lastRow = sheet.getLastRow()
  var params = JSON.stringify(e);
  var paramsArray = JSON.parse(params)
  sheet.getRange(lastRow + 1, 1).setValue('Code made changes to spreadsheet at ' + Date())
  sheet.getRange(lastRow + 1, 2).setValue(paramsArray.parameter.change)

  // here I want browser window to close
  var uniqueid = "Someuniqueid"
  return HtmlService.createHtmlOutputFromFile('Close Window'), HtmlService.createHtmlOutput(uniqueid + " is marked complete")
};

function mailIt() {
var emailAddress = Browser.inputBox('What email address do you want to send the WebApp to?')
var html = HtmlService.createTemplateFromFile('HTML Email to run Web App')
var htmlCode = html.getRawContent()
Logger.log(htmlCode)
  MailApp.sendEmail({
    name: "Publish WebApp for survey embed Test",
    to: emailAddress,
    subject: "Publish WebApp for survey embed Test",
    htmlBody:  htmlCode
  })
}

运行网络应用的HTML电子邮件

<!DOCTYPE html>
<html>
  <form action=[Your current Web App URL in quotes]>
  Send text to spreadsheet: <input type="text" name="change"><br>
  <input type="submit" value="Submit">
  </form>
</html>

显然,还有一些未解决的问题 - 比如为什么在Web应用程序似乎只打开一个向用户发送消息的窗口时自动关闭窗口的要求 - 但我相信您的用例更多比这更复杂,你和其他人可以聪明地利用这个例子中的主体对你有利。

答案 1 :(得分:1)

您无法从Apps脚本代码中关闭窗口。 Apps脚本在Google服务器上运行,此时JavaScript无法访问浏览器。你可以将JavaScript放在HTML中,它将在客户端运行(在用户浏览器中,在他们的计算机上),但是我无法做任何工作来使窗口关闭。

我尝试在HTML中添加一个脚本标记,其代码在打开窗口时自动运行。

<script>
  window.top.close();
</script>

我试过延迟;那是行不通的。

<script>
  setTimeout(function(){ window.top.close(); }, 3000);
</script>

我尝试使用window.onload函数。

<script>
  window.onload=function(){
    console.log("This onload did run");
    setTimeout(function(){ window.top.close(); }, 3000);
  };
</script>

我无法自动关闭窗口。我也无法通过一个按钮来关闭窗口。

如果您不关心用户是否看到任何内容,则可以运行Apps Script Content Service。

您可以使用带有HTML内容的对话框,可以让对话框自动关闭。它不会在另一个浏览器选项卡中打开,但您可以自动关闭它。

答案 2 :(得分:0)

使用HTML文件脚本部分末尾的以下内容关闭Google表格中当前打开的HTML窗口:

google.script.host.close();

答案 3 :(得分:0)

在您的doGet(e)函数的return语句中(而不是对我有用-我只有一个返回值),而不是使用两个用逗号分隔的HtmlServices

您可以放置​​window.top.close();在您的提交按钮的onClick事件中,如下所示:

替换:

<input type="submit" value="Submit">

使用:

<input type="submit" 
        onclick="this.value='Magic ...'; 
        google.script.run.withSuccessHandler(closeWindow); ">

并在html中添加一个位置:

<script>
   function closeWindow() { window.top.close(); }
</script> 

我希望这对某天某处的某人有用:) 干杯:)