NamedRanges 在移动范围时确实会丢失,因此它们对您的场景不是很好。但是没有其他方法可以识别元素(这是 Google Docs 的一大错误)。
对于图像,您可以使用其 LINK_URL 来识别它,这似乎是 Lucidchart 使用的。它不会妨碍用户,因此它可能是一个很好的解决方案。
关于在插入图像时获得空行并丢失属性,我想(因为您没有共享任何代码)您将图像直接插入到文档正文而不是段落中。然后会自动创建一个段落来包装您的图像,从而导致空白行和属性丢失。
下面是一些代码示例:
function initialInsert() {
var data = Charts.newDataTable().addColumn(
Charts.ColumnType.STRING, 'Fruits').addColumn(
Charts.ColumnType.NUMBER, 'Amount').addRow(
['Apple',15]).addRow(
['Orange',6]).addRow(
['Banana',14]).build();
var chart = Charts.newPieChart().setDataTable(data).build();
var body = DocumentApp.getActiveDocument().getBody()
body.appendImage(chart).setLinkUrl('http://mychart');
//here we're inserting directly in the body, a wrapping paragraph element will be created for us
}
function updateImage() {
var data = Charts.newDataTable().addColumn(
Charts.ColumnType.STRING, 'Fruits').addColumn(
Charts.ColumnType.NUMBER, 'Amount').addRow(
['Apple',Math.floor(Math.random()*31)]).addRow( //random int between 0 and 30
['Orange',Math.floor(Math.random()*31)]).addRow(
['Banana',Math.floor(Math.random()*31)]).build();
var chart = Charts.newPieChart().setDataTable(data).build();
var img = getMyImg(DocumentApp.getActiveDocument().getBody(), 'http://mychart');
//let's insert on the current parent instead of the body
var parent = img.getParent(); //probably a paragraph, but does not really matter
parent.insertInlineImage(parent.getChildIndex(img)+1, chart).setLinkUrl('http://mychart');
img.removeFromParent();
}
function getMyImg(docBody, linkUrl) {
var imgs = docBody.getImages();
for( var i = 0; i < imgs.length; ++i )
if( imgs[i].getLinkUrl() === linkUrl )
return imgs[i];
return null;
}
关于 link_url,您当然可以像 Lucidchart 那样做并链接回您的网站。因此,它不仅对用户不利。