使用Google AppScript,是否可以通过编程方式在Google表格文档中向网络发布_single sheet_?

时间:2017-10-24 17:57:36

标签: google-apps-script google-sheets google-drive-api google-sheets-api

我希望通过Google Appscript(a)以编程方式在Google表格文档中向网络发布选定的,(b)以编程方式获取每张表发布的网址,以及( c)每当相应的工作表更新时,每张工作表的发布版本都会自动更新(这应该自动发生,对吧?)。现在,我只能通过File / Publish to Web ...

来实现这一目标

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

Google Sheets API: How to "publish to web" for embeddable sheet?

但是,它似乎仅适用于发布整个Google表格文档,而不是Google表格文档中的单个表格。任何解决方案的想法都将非常受欢迎。

2 个答案:

答案 0 :(得分:0)

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

enter image description here

enter image description here

虽然我偶尔注意到这个过程有很多延迟,但它确实更新了已发表的表格。

由于Publish to the Web只显示包含工作表值的html表的只读版本,因此您可以使用一个webapp执行此操作。下面是一个以表格形式显示所有工作表的示例。

显示所有工作表的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>

答案 1 :(得分:0)

我已经对这个问题有所了解。只需修改用于访问该工作表的URL,就可以在Google表格文档中获取单个工作表的已发布HTML版本的URL。

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

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

我做的网址修改摘要:

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

可以做出的其他推论:

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

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

以下是答案:

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

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