当范围移动时,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 那样链接回您的网站。所以这不仅仅是对用户造成的破坏。