&引用;如何在javascript中获取google应用程序脚本web应用程序沙箱的url查询字符串参数?

&引用;如何在javascript中获取google应用程序脚本web应用程序沙箱的url查询字符串参数?,javascript,google-apps-script,Javascript,Google Apps Script,我有一个webapp,在一个沙箱中有多个页面作为模板。我想在我的webapp中的页面之间传递一个ID作为url参数 问题1:我不知道如何从我的javascript页面文件中访问url参数,就像使用window.location时一样。我没有得到地址栏中显示的相同url 是否有一种直接从javascript获取参数的方法,还是必须让服务器将其发送到javascript 如果我需要从服务器上获取它,我担心由于webapp意味着有多个用户在webapp的不同页面上,服务器如何知道要发送哪个url 对不

我有一个webapp,在一个沙箱中有多个页面作为模板。我想在我的webapp中的页面之间传递一个ID作为url参数

问题1:我不知道如何从我的javascript页面文件中访问url参数,就像使用window.location时一样。我没有得到地址栏中显示的相同url

是否有一种直接从javascript获取参数的方法,还是必须让服务器将其发送到javascript

如果我需要从服务器上获取它,我担心由于webapp意味着有多个用户在webapp的不同页面上,服务器如何知道要发送哪个url

对不起,如果我说的没有道理!我在下面包含一些代码,试图帮助解释这个问题

代码.gs代码:

function doGet(e){
 
 var param1 = e.parameters.v;
  
  var param2 = e.parameters.id;
  if(param1 == "form"){
  
    return loadForm(); 
  
  } else if(e.parameters.v == "class") {
    return loadClassView();
  } else {
    var tmp = HtmlService.createTemplateFromFile("home");
    tmp.baseUrlToSend = baseURL;
    
    return tmp.evaluate();
  }
}
javascript:

function OnLoad(){

   var thisURL = window.location;
   alert(thisURL);
   //I hoped this would alert something along the lines of "https://script.google.com/a/macros/s/-MY-WEB-APP-ID-/dev?v=class&id=0d2f35e9-d785-4fab-a8ee-fe8933f1c159" 
   //But what this actually alerts is "https://n-g5aftzut - REMOVED FOR SECURITY -mmajfkwvesq-0lu-script.googleusercontent.com/userCodeAppPanel"
    
}
提前谢谢

答复: 您需要评估参数server-side以确定要加载的页面。页面的链接应该相应地用HTML编写

更多信息: 脚本URL和加载内容的页面的来源不同。因此,您不能使用
window.location
获取脚本URL,因为您将收到
googleusercontent.com
地址,而不是
script.google.com
地址

解决: 第一种方法是简单地将HTML修改为URL中的硬代码。您的
doGet()
函数将类似于:

函数doGet(e){
如果(!e.parameter.v | | e.parameter.v==“home”){
返回HtmlService.createTemplateFromFile(“home”).evaluate();
}  
else if(e.parameter.v==“form”){
返回loadForm();
}  
else if(e.parameter.v==“类”){
返回loadClassView();
}
}
函数loadForm(){
//在这里做一些模板处理
返回HtmlService.createTemplateFromFile('form').evaluate();
}
函数loadClassView(){
//在这里做一些模板处理
返回HtmlService.createTemplateFromFile('class').evaluate();
}
然后在HTML中,您可以在链接中硬编码:


或者,当为相应页面调用
doGet()
函数时,您可以使用当前模板并插入脚本url:

函数doGet(e){
如果(!e.parameter.v | | e.parameter.v==“home”){
返回HtmlService.createTemplateFromFile(“home”).evaluate();
}  
//等等。。。
}
函数getScriptUrl(){
var url=ScriptApp.getService().getUrl();
返回url;
}
并将其插入html文件中需要的位置:


这里的scriptlet将调用服务器端代码中定义的
getScriptUrl()
函数,该函数返回web应用程序url,然后将其附加到锚元素中参数的开头

我希望这对你有帮助

参考资料:

@OP要补充这一点,其中一个重要的原因是,你不能简单地做
window.top.location.href
是因为受到的限制,在这里你可以编写
top
href,但不能阅读它。@Rafa Guillermo谢谢你!我必须将ID作为第二个参数添加到url中,这是通过搜索电子表格(充当db)获得的。因此,我认为我无法在HTML中硬编写url。如果我从服务器获取url,多个用户是否会导致这种情况出现问题?我能够创建url没有问题,但我不知道如何通过server@JohnKane您可以用同样的方法获取ID。在
code.gs
文件中定义一个
getId()
函数,并让它返回id。然后,您可以在html中调用
,并以相同的方式附加它:
@JohnKane多个用户不会导致问题,而是会话的不同调用。如果它依赖于用户,则根据组织的设置,您可以作为“访问web应用的用户”运行web应用,并相应地处理该信息。相关: