gpt4 book ai didi

javascript - 如何在 Google appScripts 的 HtmlService.SandboxMode.IFRAME 中设置 iframe 属性

转载 作者:行者123 更新时间:2023-11-28 06:00:44 24 4
gpt4 key购买 nike

我创建了一个 Google 协作平台页面,该页面将快速显示“我们的协会欢迎”,然后在其下方显示一个 appScript,该脚本将显示 Google 电子表格中列出的任何名称。当您访问该网站时,一切都运行良好,但该项目的预期用途是使用 RiseVision 在我们的大厅中放置数字标牌。 RiseVision 使用网页小部件,仅显示页面并根据经常指定的方式更新它。现在,RiseVision 显示屏上的页面将显示“我们的协会欢迎”消息,但不会显示名称。在控制台中我可以看到一个错误

"Refused to display 'https://...' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

现在我知道有一个名为allow-same-origin的白名单iframe属性,但我不知道在哪里应用它,因为我相信框架是通过HtmlService创建的。

Here是我制作的 Google 协作平台页面。

Here是仅加载网页小部件的演示文稿的预览。

这里是 appScript、js 以及它返回的 HTML:

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;
}

和 HTML

<!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>

我真的认为我的问题出在 doGet() 函数中。为了清楚起见,这里对其进行了进一步分解。

function doGet(){
var app = HtmlService.createHtmlOutputFromFile('nameBox.html');
app.setSandboxMode(HtmlService.SandboxMode.IFRAME);
return app;
}

如果它返回一个创建 iframe(?) 的 HtmlOutput 对象,我可以在哪里添加属性以使其允许同源?或者说这有可能吗?对此的任何帮助将不胜感激。我的网络开发技能已经生锈了,因此我已经为此绞尽脑汁了几个星期。

最佳答案

有点晚了,但只是把它放在那里,以便其他人可以使用此信息。

要允许 Google 脚本返回 html 输出以在其他网站的 iframe 中使用,您的设置应该是 -

    return HtmlService
.createTemplateFromFile('form')// form or whatever your html file is called
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

这个例子没有赋值任何变量,直接返回HtmlService。

您应该使用“createTemplateFromFile”,后跟“evaluate()”,并将“XFrameOptionsMode”设置为 ALLOWALL,而不是“createHtmlOutputFromFile”。

希望这有帮助

关于javascript - 如何在 Google appScripts 的 HtmlService.SandboxMode.IFRAME 中设置 iframe 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com