Javascript 如何在Google appScripts';HtmlService.SandboxMode.IFRAME
我创建了一个GoogleSites页面,该页面将显示一个快速的“我们的协会欢迎”,然后在该页面下显示一个appScript,该脚本将显示Google电子表格中列出的任何名称。当您访问该网站时,一切都很好,但该项目的预期用途是使用RiseVision在我们的大厅中制作数字看板。RiseVision使用一个Web页面小部件,它只显示一个页面,并根据指定的频率对其进行更新。现在在RiseVision显示屏上,页面将显示“我们的协会欢迎”消息,但不会显示名称。在控制台中,我可以看到一个错误 “拒绝展示”https://...“在一个框架中,因为它设置了 “X-Frame-Options”到“SAMEORIGIN” 现在我知道有一个名为allow same origin的白名单iframe属性,但我不知道在哪里应用它,因为我相信框架是通过HtmlService创建的 是我制作的谷歌网站页面 是仅加载网页小部件的演示文稿预览 下面是appScript,js,后跟返回的HTML:Javascript 如何在Google appScripts';HtmlService.SandboxMode.IFRAME,javascript,html,iframe,google-apps-script,Javascript,Html,Iframe,Google Apps Script,我创建了一个GoogleSites页面,该页面将显示一个快速的“我们的协会欢迎”,然后在该页面下显示一个appScript,该脚本将显示Google电子表格中列出的任何名称。当您访问该网站时,一切都很好,但该项目的预期用途是使用RiseVision在我们的大厅中制作数字看板。RiseVision使用一个Web页面小部件,它只显示一个页面,并根据指定的频率对其进行更新。现在在RiseVision显示屏上,页面将显示“我们的协会欢迎”消息,但不会显示名称。在控制台中,我可以看到一个错误 “拒绝展示”
var DOC_ID = "1E969qh8NenAXICpnuuYSIICM9CzUh888FnFULR-gfls";
function doGet(){return HtmlService.createHtmlOutputFromFile('nameBox.html')
.setSandboxMode(HtmlService.SandboxMode.IFRAME);}
function createNameArray(){
var sheet = SpreadsheetApp.openById(DOC_ID).getSheetByName("WelcomeNames");
var names = sheet.getDataRange().getValues();
var nameArray = new Array;
var permaName = names[1][2];
for(var i=0;i<names.length;i++){
nameArray[i] = names[i][0];
}
return nameArray;
}
如果它返回一个创建iframe(?)的HtmlOutput对象,我在哪里可以添加一个属性使其允许相同的来源?或者这是可能的?对此的任何帮助都将不胜感激。我的web开发技能已经过时了,因此我已经为此绞尽脑汁好几个星期了。有点晚了,但只是把它放在那里,以便其他人可以使用此信息 要允许google脚本返回html输出,以便在其他网站的iframe中使用,您的设置应该如下-- 本例不分配任何变量,直接返回HtmlService 您应该使用'createTemplateFromFile',后跟'evaluate()',并将'XFrameOptionsMode'设置为ALLOWALL,而不是'CreateTmloutFromFile' 希望这有帮助
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function onSuccess(nameArray) {
var i = 0;
//display style: 0=cycle; 1=all names; 2=one name only
var displayStyle = 2;
// cycle through list of names one at a time
if (displayStyle == 0){
var timer = setInterval(cycleNames, 120000);
function cycleNames(){
if (i <= nameArray.length){
var div = document.getElementById("textDiv");
div.textContent = nameArray[i];
var text = div.textContent;
i++;
}
if (i > nameArray.length){i = 0;}
}
}
// Display all names at once in columns
else if (displayStyle == 1){
function tableCreate() {
var body = document.body,
tbl = document.createElement('table');
tbl.style.width = '100%';
var numNames = nameArray.length;
var col, row, count;
if (numNames <= 5){col = 1;}
else if ((numNames > 5) && (numNames < 11)){col = 2;}
else if (numNames > 11){col = 3;}
row = Math.ceil(numNames/col);
count = 0;
for(var x=0;x<row;x++){
var tr = tbl.insertRow();
for(var y=0;y<col;y++){
if ((count <= numNames) && (nameArray[count]!=null)){
var td = tr.insertCell();
td.appendChild(document.createTextNode(nameArray[count]));
count++;
} else {td.appendChild(document.createTextNode(" "));}
}
}
body.appendChild(tbl);
}
tableCreate();
}
// Display one name perminantly
else if (displayStyle == 2){
var div = document.getElementById("textDiv");
div.textContent = "Jordan";
var text = div.textContent;
}
}
google.script.run.withSuccessHandler(onSuccess).createNameArray();
</script>
<style>
#textDiv {
text-align: center;
color: red;
font-family: verdana, arial;
font-size: 48px;
font-weight: bold;
}
table, td, tr {
padding: 20px;
color: red;
text-align: center;
font-family: verdana, arial;
font-size: 30px;
font-weight: bold;
}
</style>
</head>
<body>
<div id="textDiv"></div>
</body>
</html>
function doGet(){
var app = HtmlService.createHtmlOutputFromFile('nameBox.html');
app.setSandboxMode(HtmlService.SandboxMode.IFRAME);
return app;
}
return HtmlService
.createTemplateFromFile('form')// form or whatever your html file is called
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);