Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Google appScripts';HtmlService.SandboxMode.IFRAME_Javascript_Html_Iframe_Google Apps Script - Fatal编程技术网

Javascript 如何在Google appScripts';HtmlService.SandboxMode.IFRAME

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显示屏上,页面将显示“我们的协会欢迎”消息,但不会显示名称。在控制台中,我可以看到一个错误 “拒绝展示”

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

“拒绝展示”https://...“在一个框架中,因为它设置了 “X-Frame-Options”到“SAMEORIGIN”

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

是我制作的谷歌网站页面

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

下面是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;
}

如果它返回一个创建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);