我希望通过Google Appscript(a)以编程方式在Google表格文档中向网络发布选定的表,(b)以编程方式获取每张表发布的网址,以及( c)每当相应的工作表更新时,每张工作表的发布版本都会自动更新(这应该自动发生,对吧?)。现在,我只能通过File / Publish to Web ...
来实现这一目标以下问答与此问题高度相关:
Google Sheets API: How to "publish to web" for embeddable sheet?
但是,它似乎仅适用于发布整个Google表格文档,而不是Google表格文档中的单个表格。任何解决方案的想法都将非常受欢迎。
答案 0 :(得分:0)
看起来您可以根据这些对话框发布单个工作表:
虽然我偶尔注意到这个过程有很多延迟,但它确实更新了已发表的表格。
由于Publish to the 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);
}
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表格中处理的工作表的网址,直接从我的浏览器的网址栏中复制:
然后,我可以按如下方式修改URL,以获取该单页的已发布HTML版本:
我做的网址修改摘要:
可以做出的其他推论:
这些新见解将我的问题转换为新问题:即如何以编程方式获取(通过Google Appscript)我正在处理的Google表格文档的ID以及电子表格的ID正在努力?
以下是答案:
var ss = SpreadsheetApp.getActiveSpreadsheet().getId();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();
var publishedURL = "https://docs.google.com/spreadsheets/u/0/d/" + ss + "/htmlembed/sheet?gid=" + sheet;
但仍存在一个挥之不去的问题:此发布网址的用户似乎必须手动刷新浏览器才能将HTML与电子表格同步。目前,我还没有解决此问题的方法,除了请求URL用户安装自动URL刷新或定期手动刷新页面。我对此表示欢迎。