【问题标题】:insert image at specific point of paragraph在段落的特定点插入图像
【发布时间】:2013-12-29 20:44:54
【问题描述】:

*我有一个带有类似“text {logo} text”的字符串的 Google 文档 如何将图像放置在 {logo} 所在的位置? 到目前为止我试过了:

var logoElement = s.findText("{logo}").getElement();
logoElement.getParent().insertInlineImage(0,logoBlob);
s.replaceText("{logo}", "");

但这会在找到的段落之前插入图像(或使用1:之后)。如何将它放在段落的确切位置?

【问题讨论】:

  • 你看过这篇文章吗? stackoverflow.com/questions/11211434/…
  • 另请阅读 cmets。
  • Serge,帖子(和 cmets)在一段中声明了搜索字符串“必须单独”。我的问题是关于段落中间的搜索字符串 ,其中 only 该部分被替换。我的示例在查找搜索字符串时没有问题,但是它将图像放置在整个段落之前(或之后),而不是将其放置在搜索字符串的前面。
  • 这个想法正是将文本拆分到您想要在正确位置创建段落的位置,因为内联图像总是放置在段落之间......这不是一个解决方案吗? (我将其写为评论,因为这只是一个建议:-)
  • 谢谢谢尔盖。您建议的链接中的原始帖子确实很有帮助。你会碰巧知道如何为段落设置标签位置吗?

标签: google-apps-script google-docs


【解决方案1】:

感谢 Serge 的评论和链接的原始帖子为我指明了正确的方向。 这是我现在拥有的:

var s = d.getHeader();
var logoResult = s.findText("{logo}"); // search result
var logoElement = logoResult.getElement(); // the paragraph that contains the placeholder
var text = logoElement.getText();
var placeholderStart = logoResult.getStartOffset(); // character position start placeholder
var placeholderEnd = logoResult.getEndOffsetInclusive(); // char. position end placeholder
var parent = logoElement.getParent(); 
var parPosition = parent.getChildIndex(logoElement);

// add new paragraph after the found paragraph, with text preceding the placeholder
var beforeAndLogo = s.insertParagraph(parPosition+2, text.substring(0, placeholderStart));
var logo = beforeAndLogo.appendInlineImage(logoBlob); // append the logo to that new paragraph

// add new paragraph after the new logo paragraph, containing the text after the placeholder
var afterLogo = s.insertParagraph(parPosition+3, text.substring(placeholderEnd+1));
afterLogo.merge(); // merge these two paragraphs

// finally remove the original paragraph
parent.removeFromParent(); // remove the original paragraph

这不完整,我应该也复制所有的属性。 更重要的是,它不会复制选项卡设置(例如中心选项卡)。还没有找到设置标签位置的方法。

【讨论】:

  • 你找到复制属性的方法了吗?我一直在解决这个问题,似乎即使 getAttributes() 也没有正确应用它们。
【解决方案2】:

我根据您的回答尝试了一个更简单的版本,该版本保持了原始段落的格式......

试一试,它不是“万无一失”,但它在我的测试中有效,并且(我认为)是一个有趣的试验;-)

代码在这里:

function test(){
  placeImage('{logo}','0B3qSFd3iikE3SkFXc3BYQmlZY1U');
//This is my page and I’d like to have a {logo} on it right here
}


function placeImage(placeHolder,imageId) {
  var logoBlob = DocsList.getFileById(imageId).getBlob();
  var d = DocumentApp.getActiveDocument()
  var s = d.getHeader();
  var logoResult = s.findText(placeHolder); 
  var placeholderStart = logoResult.getStartOffset(); 
  var par = s.getChild(0).asParagraph();
  var parcopy = par.copy();
  var parLen = par.editAsText().getText().length-1;
  Logger.log('placeholderStart = '+placeholderStart+'  parLen = '+parLen)
  par.editAsText().deleteText(placeholderStart, parLen);
  parcopy.editAsText().deleteText(0, placeholderStart+placeHolder.length);
  var img = s.getChild(0).appendInlineImage(logoBlob);
  s.appendParagraph(parcopy);
  parcopy.merge();
}

【讨论】:

  • 这不会删除文本读取部分中的格式属性吗?
【解决方案3】:

希望对我有所帮助,下面的代码对我来说很好。

function insertImage(doc) {
  // Retrieve an image from the web.
  var resp = UrlFetchApp.fetch("http://www.google.com/intl/en_com/images/srpr/logo2w.png");
  var image = resp.getBlob();
  var body = doc.getBody();
  var oImg = body.findText("<<Logo1>>").getElement().getParent().asParagraph();
  oImg.clear();
  oImg = oImg.appendInlineImage(image);
  oImg.setWidth(100);
  oImg.setHeight(100);
}

【讨论】:

  • 这个答案对于更一般的问题来说很漂亮。恭喜 - 非常感谢! - 关于美观和快速代码!
  • 我不得不说这解决了我更普遍的问题,也解决了在模板中轻松查找标签的问题。感谢您提供迄今为止我所见过的解决此问题的最佳和最清晰的代码。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2022-09-19
  • 2019-02-09
  • 2015-12-11
相关资源
最近更新 更多