0

我想通过 Google Appscript (a) 以编程方式将 Google Sheets 文档中选定的工作发布到网络上,(b) 以编程方式获取发布每张工作表的 URL,以及 (c) 自动获得每张工作表的发布版本每当更新相应的工作表时更新(这应该会自动发生,对吗?)。现在,我只能通过文件/发布到 Web 来完成此操作...

以下问答与此问题高度相关:

Google Sheets API:如何为可嵌入工作表“发布到网络”?

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

4

2 回答 2

3

我对这个问题有了一些了解。只需修改用于访问该工作表的 URL,即可获得指向 Google 表格文档中单个工作表的已发布 HTML 版本的 URL。

例如,这是我在 Google 表格中处理的工作表的 URL,直接从浏览器的 URL 栏中复制:

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

然后,我可以按如下方式修改 URL,以获取该单张工作表的已发布 HTML 版本:

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

我所做的 URL 修改摘要:

  1. 将“电子表格”后的“/d”替换为“/u/0/d”
  2. 将“edit#”替换为“htmlembed/sheet?”

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

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

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

这是答案:

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

但是,仍然存在一个挥之不去的问题:此已发布 URL 的用户似乎必须手动刷新浏览器才能将 HTML 与电子表格同步。目前,除了要求 URL 的用户安装自动 URL 刷新器或定期手动刷新页面外,我没有解决此问题的方法。我欢迎对此提出任何想法。

于 2017-10-24T18:59:36.317 回答
1

看起来您可以根据这些对话框发布单个工作表:

在此处输入图像描述

在此处输入图像描述

它确实更新了已发布的表格,尽管我偶尔注意到该过程中有相当多的延迟。

由于 Publish to the Web 仅显示包含工作表值的 html 表的只读版本,因此您可以使用一个 web 应用程序来做到这一点。下面是一个以表格形式显示所有工作表的示例。

一个显示所有工作表的 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);
}

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

onesheet.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>
于 2017-10-24T18:20:37.880 回答