当前位置: 首页 > 知识库问答 >
问题:

使用GoogleAppScript,是否可以通过编程方式将GoogleSheets文档中的单个页面发布到web?

孙昂然
2023-03-14

我希望通过Google Appscript(a)以编程方式将Google sheets文档中选定的工作表发布到web上,(b)以编程方式获取每个工作表发布的URL,以及(c)在更新相应工作表时自动更新每个工作表的发布版本(这应该是自动发生的,对吧?)。现在,我只能通过文件/发布到Web来实现这一点。。。

以下问答与这个问题高度相关:

谷歌工作表应用编程接口:如何“发布到网络”可嵌入的工作表?

但是,它似乎只适用于发布整个Google Sheets文档,而不是Google Sheets文档中的单个工作表。任何解决方案的想法都将不胜感激。

共有2个答案

洪雅健
2023-03-14

看起来您可以根据以下对话框发布各个图纸:

它确实会更新已发布的工作表,尽管我偶尔会注意到在这个过程中有相当多的延迟。

由于“发布到Web”只是显示包含图纸值的html表的只读版本,因此您可以使用一个webapp来实现这一点。下面是一个以表格形式显示所有图纸的示例。

function publishAllSheets() 
{
  var ss=SpreadsheetApp.getActive();
  var allShts=ss.getSheets();
  var s='All my Sheets';
  for(var i=0;i<allShts.length;i++)
  {
    var sh=allShts[i];
    var rg=sh.getDataRange();
    var vA=rg.getValues();
    s+=Utilities.formatString('Sheet: %s <br /><table border="1">',allShts[i].getName());
    for(var j=1;j<vA.length;j++)
    {
      s+='<tr>';
      for(var k=0;k<vA[j].length;k++)
      {
        s+=Utilities.formatString('<td>%s</td>', vA[j][k]);
      }
      s+='</tr>';
    }
    s+='</table>';
  }
  return s;
}

function showAllMySheets()
{
  var ui=HtmlService.createHtmlOutputFromFile('allsheets').setWidth(1000);
  SpreadsheetApp.getUi().showModelessDialog(ui, 'All My Sheets')
}  

function doGet()
{
  var ui=HtmlService.createHtmlOutputFromFile('allsheets');
  return ui.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

所有床单。html

<!DOCTYPE html>
<html>
  <head>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script>
   $(function(){
     google.script.run
        .withSuccessHandler(updateDiv)
        .publishAllSheets();
   });

   function updateDiv(hl)
   {
     document.getElementById('c1').innerHTML=hl;
   }
  </script>
  </head>
  <body>
   <div id="c1"></div>  
  </body>
</html>
function getSheetNames()
{
  var ss=SpreadsheetApp.getActive();
  var allShts=ss.getSheets();
  var shts=[];
  for(var i=0;i<allShts.length;i++)
  {
    shts.push(allShts[i].getName());
  }
  return shts;
}

function getOneSheet(name)
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(name);
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var s='';
  s+=Utilities.formatString('Sheet: %s <br /><table border="1">',sh.getName());
  for(var j=1;j<vA.length;j++)
  {
    s+='<tr>';
    for(var k=0;k<vA[j].length;k++)
    {
      s+=Utilities.formatString('<td>%s</td>', vA[j][k]);
    }
    s+='</tr>';
  }
  s+='</table>';
  return s;
}

一张纸。html

<!DOCTYPE html>
<html>
  <head>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
   <script>
   $(function(){
     google.script.run
        .withSuccessHandler(updateSelect)
        .getSheetNames();
   });

   function updateDiv(hl)
   {
     document.getElementById('c1').innerHTML=hl;
   }

   function updateSelect(vA)
    {
      var select = document.getElementById("sel1");
      select.options.length = 0; 
      for(var i=0;i<vA.length;i++)
      {
        select.options[i] = new Option(vA[i],vA[i]);
      }
    }

    function getSelectedSheet()
    {
      var name=$('#sel1').val();
      google.script.run
         .withSuccessHandler(updateDiv)
         .getOneSheet(name);
    }
   console.log('MyCode');
  </script>
  </head>
  <body>
    <select id="sel1">
      <option value="" selected></option>
   </select>
   <input type="button" value="Select" onClick="getSelectedSheet();" />
   <div id="c1"></div>
  </body>
</html>
梁丘逸仙
2023-03-14

我对这个问题有了一些见解。只需修改用于访问表单的URL,就可以在GoogleSheets文档中获取单个表单的已发布HTML版本的URL。

例如,这是我在谷歌工作表中工作的工作表的网址,直接从我浏览器的网址栏复制:

https://docs.google.com/spreadsheets/d/1fTx3dUsvdbVKgP2nXs1LcyG_7oBp-MoFZTXn7MtdEZg/edit#gid=1711661074

然后,我可以按照以下方式修改URL,以获得该工作表的已发布超文本标记语言版本:

https://docs.google.com/spreadsheets/u/0/d/1fTx3dUsvdbVKgP2nXs1LcyG_7oBp-MoFZTXn7MtdEZg/htmlembed/sheet?gid=1711661074

我所做的URL修改摘要:

  1. 将电子表格后的/d改为/u/0/d
  2. 将编辑#替换为htmlembed/表?

人们可以作出的其他推论:

  1. “/u/0/d”后面的长字符串是Google Sheets文档的ID
  2. “sheet”后面的较短字符串是该文档中单个工作表的ID

这些新的见解将我的问题转化为一个新的问题:即,如何通过编程方式(通过Google Appscript)获取我正在处理的Google Sheets文档的ID,以及我正在处理的电子表格的ID

答案如下:

  1. 要获取Appcript中当前Google Sheets文档的ID:
    var ss=SpreadsheetApp.getActiveSpreadsheetA(). getId();
  2. 要获取当前Google Sheets文档中当前工作表的ID:
    var表=SpreadsheetApp.getActiveSpreadSheetA(). getActiveSheet(). getSheetId();
  3. 我现在可以通过字符串连接为Google Sheets文档中任何单个工作表的已发布html版本构建一个URL,如下所示:
    var PublishedURL="https://docs.google.com/spreadsheets/u/0/d/"ss"/htmlembed/片?gid="表;

不过,仍然有一个悬而未决的问题:似乎此已发布URL的用户必须手动刷新浏览器,以便将HTML与电子表格同步 目前,除了请求URL用户安装自动URL刷新器或定期手动刷新页面之外,我没有解决此问题的方法。我欢迎你对此有任何想法。

 类似资料:
  • 问题内容: 我需要以编程方式启动新的Java进程并动态设置JMX端口。所以不要这样做 我想做以下 但这不起作用。知道为什么吗? 问题答案: 在调用代码时,您已经错过了配置jmxremote连接器的机会。 您需要做的是创建您自己的rmi注册表和JMXConnectorServer来侦听rmi调用并将它们传递给MBeanServer。

  • 问题内容: 这有点难以描述,但我会尽力而为: 我正在开发一个使用自定义相机活动的android应用。在此摄影机活动中,我使用编程方式创建一个表面视图,并将其设置为xml布局文件中定义的框架布局(全屏显示)。 我现在的问题是,如何在框架布局中添加其他元素?仅以编程方式?我问,因为到目前为止,我只能以编程方式添加其他元素。我在xml布局中添加的元素没有出现在屏幕上。它们是否可能恰好位于我添加到框架布局

  • 问题内容: 我找到了许多参考资料,它们解释了如何使用该类以编程方式编译Java 类: 但是,我想知道是否有一个开放源代码库,可以让我编译以编程方式生成的源代码(因此不涉及src文件)并在输出流中生成一些字节代码(而不在文件系统中生成类文件) )。 例如,我正在寻找能够写这样的东西: 谢谢你的帮助。 问题答案: 首先,请看JavaCompiler API 。基本上: 在字符串中创建Java类。 将字

  • 问题内容: 说我有两个JavaBeans 和。 如果创建一个Person对象的列表,我想编组成这样的东西: 可以使用这里描述的技术: 使用JAXB解组/编组List 通过使用和注释JaxbList,可以将其编组为上述XML。 但是,能够重用相同的类来封送对象列表也很好。实际上,我将有许多其他类型的bean。我可以这样: 但是,理想情况下,最好用类名的复数形式替换“列表”,用类名替换“ item”。

  • 问题内容: 我正在学习ReactJs,真的很喜欢。我想问一下我们是否可以按类名呈现虚拟DOM以进行文档记录。 我试图通过 getElementByClassName(’class’) 作为react的render方法的第二个参数,它不起作用。React是否仅将DOM呈现给ID唯一的节点,还是有一种使用类的节点的解决方法? 问题答案: 看来您使用了错误的方法。 可能您应该使用而不是。并且不要忘记返回

  • 当我得到一个Spring豆(通过getBean())时,有没有办法从java代码中验证豆子是否已经用范围=原型定义了? Spring配置: Java: sc 我可以实例化它两次并比较对象,但是我想避免不必要的对象创建。这个答案的反义词可能会有用:https://stackoverflow.com/a/9125610/156477