我希望通过Google Appscript(a)以编程方式将Google sheets文档中选定的工作表发布到web上,(b)以编程方式获取每个工作表发布的URL,以及(c)在更新相应工作表时自动更新每个工作表的发布版本(这应该是自动发生的,对吧?)。现在,我只能通过文件/发布到Web来实现这一点。。。
以下问答与这个问题高度相关:
谷歌工作表应用编程接口:如何“发布到网络”可嵌入的工作表?
但是,它似乎只适用于发布整个Google Sheets文档,而不是Google Sheets文档中的单个工作表。任何解决方案的想法都将不胜感激。
看起来您可以根据以下对话框发布各个图纸:
它确实会更新已发布的工作表,尽管我偶尔会注意到在这个过程中有相当多的延迟。
由于“发布到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>
我对这个问题有了一些见解。只需修改用于访问表单的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修改摘要:
人们可以作出的其他推论:
这些新的见解将我的问题转化为一个新的问题:即,如何通过编程方式(通过Google Appscript)获取我正在处理的Google Sheets文档的ID,以及我正在处理的电子表格的ID
答案如下:
var ss=SpreadsheetApp.getActiveSpreadsheetA(). getId();
var表=SpreadsheetApp.getActiveSpreadSheetA(). getActiveSheet(). getSheetId();
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