Google apps script 使用GoogleAppScript,是否可以通过编程方式将GoogleSheets文档中的单个页面发布到web?
我希望通过Google Appscript(a)以编程方式将Google sheets文档中选定的工作表发布到web上,(b)以编程方式获取每个工作表发布的URL,以及(c)在更新相应工作表时自动更新每个工作表的发布版本(这应该是自动发生的,对吧?)。现在,我只能通过文件/发布到Web来实现这一点 以下问题和答案与此问题高度相关:Google apps script 使用GoogleAppScript,是否可以通过编程方式将GoogleSheets文档中的单个页面发布到web?,google-apps-script,google-sheets,google-drive-api,google-sheets-api,web-publishing,Google Apps Script,Google Sheets,Google Drive Api,Google Sheets Api,Web Publishing,我希望通过Google Appscript(a)以编程方式将Google sheets文档中选定的工作表发布到web上,(b)以编程方式获取每个工作表发布的URL,以及(c)在更新相应工作表时自动更新每个工作表的发布版本(这应该是自动发生的,对吧?)。现在,我只能通过文件/发布到Web来实现这一点 以下问题和答案与此问题高度相关: 但是,它似乎只适用于发布整个Google Sheets文档,而不适用于发布Google Sheets文档中的单个页面。任何解决方案想法都将不胜感激。看起来您可以根据
但是,它似乎只适用于发布整个Google Sheets文档,而不适用于发布Google Sheets文档中的单个页面。任何解决方案想法都将不胜感激。看起来您可以根据以下对话框发布单个页面: 它确实会更新已发布的工作表,尽管我偶尔会注意到在这个过程中有相当多的延迟 由于“发布到Web”只是显示包含工作表值的html表格的只读版本,因此您可以使用一个Web应用程序执行此操作。下面的示例以表格形式显示所有工作表 显示所有图纸的Web应用程序:
函数publishAllSheets()
{
var ss=SpreadsheetApp.getActive();
var allShts=ss.getSheets();
var s='我所有的床单';
对于(var i=0;i而言,您似乎可以根据以下对话框发布各个工作表:
它确实会更新已发布的工作表,尽管我偶尔会注意到在这个过程中有相当多的延迟
由于“发布到Web”只是显示包含工作表值的html表格的只读版本,因此您可以使用一个Web应用程序执行此操作。下面的示例以表格形式显示所有工作表
显示所有图纸的Web应用程序:
函数publishAllSheets()
{
var ss=SpreadsheetApp.getActive();
var allShts=ss.getSheets();
var s='我所有的床单';
对于(var i=0;i我对这个问题有了一些了解。只需修改用于访问该工作表的URL,就可以获得Google Sheets文档中单个工作表的已发布HTML版本的URL
例如,以下是我在Google Sheets中处理的工作表的URL,直接从浏览器的URL栏复制:
然后,我可以按如下方式修改URL,以获得该单页的已发布HTML版本:
我所做的URL修改摘要:
将“电子表格”之后的“/d”替换为“/u/0/d”
将“编辑”替换为“htmlembed/sheet?”
人们可以作出的其他推论:
“/u/0/d”后面的长字符串是Google Sheets文档的ID。
“sheet?”后面的较短字符串是该文档中单个工作表的ID。
这些新的见解将我的问题转化为一个新的问题:即,我如何通过编程(通过Google Appscript)获得我正在处理的Google Sheets文档的ID,以及我正在处理的电子表格的ID
答案如下:
要获取Appscript中当前Google Sheets文档的ID:
var ss=SpreadsheetApp.getActiveSpreadsheet().getId();
要在当前Google Sheets文档中获取当前工作表的ID:
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();
我现在可以通过字符串连接为Google Sheets文档中任何一张表单的已发布html版本构建URL,如下所示:
var publishedURL=”https://docs.google.com/spreadsheets/u/0/d/“+ss+”/htmlembed/sheet?gid=“+sheet;
不过,仍然有一个挥之不去的问题:此已发布URL的用户似乎必须手动刷新浏览器,以便将HTML与电子表格同步。目前,我没有解决此问题的方法,只能请求URL用户安装自动URL刷新器或定期手动刷新页面y、 我欢迎对此有任何想法。我对这个问题有了一些见解。只需修改用于访问该页面的URL,就可以在Google Sheets文档中获得单个页面的已发布HTML版本的URL
例如,以下是我在Google Sheets中处理的工作表的URL,直接从浏览器的URL栏复制:
然后,我可以按如下方式修改URL,以获得该单页的已发布HTML版本:
我所做的URL修改摘要:
将“电子表格”之后的“/d”替换为“/u/0/d”
将“编辑”替换为“htmlembed/sheet?”
人们可以作出的其他推论:
“/u/0/d”后面的长字符串是Google Sheets文档的ID。
“sheet?”后面的较短字符串是该文档中单个工作表的ID。
这些新的见解将我的问题转化为一个新的问题:即,我如何通过编程(通过Google Appscript)获得我正在处理的Google Sheets文档的ID,以及我正在处理的电子表格的ID
答案如下:
要获取Appscript中当前Google Sheets文档的ID:
var ss=SpreadsheetApp.getActiveSpreadsheet().getId();
要在当前Google Sheets文档中获取当前工作表的ID:
var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();
我现在可以通过字符串连接为Google Sheets文档中任何一张表单的已发布html版本构建URL,如下所示:
var publishedURL=”https://docs.google.com/spreadsheets/u/0/d/“+ss+”/htmlembed/sheet?gid=“+sheet;
不过,仍然有一个挥之不去的问题:这个已发布URL的用户似乎必须手动刷新浏览器,以便将HTML与电子表格同步
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);
}
<!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;
}
<!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>