【问题标题】:Insert image into a specified location将图像插入指定位置
【发布时间】:2012-06-26 16:04:40
【问题描述】:

我有一个 Google Apps 脚本,它通过调用 body.replaceText('TextA', 'TextB'); 将模板文档副本中的占位符替换为一些文本。

现在我想扩展它以包含图像。有人知道怎么做吗?

谢谢你, 安德烈

编辑:只是为了弄清楚我的脚本是做什么的。我在电子表格中创建了一个 Google 表单。我创建了一个脚本,它在表单提交时运行,遍历与表单对应的工作表,查找未处理的行,从相应的单元格中获取值并将它们放入 Google 文档的副本中。 Google 表单中的某些字段是多行文本字段,这就是 '\r\r' 的来源。

这是我现在想出的一种解决方法,并不优雅,但到目前为止它有效:

// replace <IMG src="URL"> with the image fetched from URL
function processIMG_(Doc) {

  var totalElements = Doc.getNumChildren();

  for( var j = 0; j < totalElements; ++j ) {

    var element = Doc.getChild(j);
    var type = element.getType();

    if (type =='PARAGRAPH'){
      var par_text = element.getText();

      var start = par_text.search(new RegExp('<IMG'));
      var end = par_text.search(new RegExp('>'));
      if (start==-1)
        continue;

      // Retrieve an image from the web.
      var url = getURL_(par_text.substring(start,end));
      if(url==null)
        continue;

      // Before image
      var substr = par_text.substring(0,start);
      var new_par = Doc.insertParagraph(++j, substr);

      // Insert image
      var resp = UrlFetchApp.fetch(url);
      new_par.appendInlineImage(resp.getBlob());

      // After image
      var substr = par_text.substring(end+1);
      Doc.insertParagraph(++j, substr);

      element.removeFromParent();
      j -= 2; // one - for latter increment; another one - for increment in for-loop
      totalElements = Doc.getNumChildren();      
    }      
  }
}

【问题讨论】:

  • 您的脚本是如何使用此替换功能添加 '\r\r' 的?我想我错过了什么?

标签: google-docs google-apps-script google-docs-api


【解决方案1】:

这是一段(大致)你想要的代码。

(可能还有其他方法可以做到这一点,它肯定需要一些改进,但总体思路就在那里)

我已选择在文档中使用“###”来标记要插入图片的位置,图片必须在您的谷歌驱动器中(或者更准确地说是在“某些”谷歌驱动器中)。 下面的代码使用了我共享的文档和我共享的图像,因此您可以尝试一下。 这里是the link to the doc,不要忘记在测试之前删除图像并在某处放置###(如果有人在你之前运行过代码;-)

function analyze() { // just a name, I used it to analyse docs
  var Doc = DocumentApp.openById('1INkRIviwdjMC-PVT9io5LpiiLW8VwwIfgbq2E4xvKEo');
  var image = DocsList.getFileById('0B3qSFd3iikE3cF8tSTI4bWxFMGM')
    var totalElements = Doc.getNumChildren();
    var el=[]
    for( var j = 0; j < totalElements; ++j ) {
      var element = Doc.getChild(j);
      var type = element.getType();
Logger.log(j+" : "+type);// to see doc's content
       if (type =='PARAGRAPH'){
       el[j]=element.getText()
       if(el[j]=='###'){element.removeFromParent();// remove the ###
         Doc.insertImage(j, image);// 'image' is the image file as blob 
         }
       }
    }
}

编辑:为了让这个脚本在其段落中使用### 字符串必须单独,之前或之后没有其他字符...请记住,每次使用 ENTER 强制换行时文档创建一个新段落。

【讨论】:

  • 谢谢你,谢尔盖!这就是我需要的。现在我正在尝试将诸如“Test\r\r###\r\rTest”之类的文本拆分为段落,以使您的代码在我的项目中工作。
  • 不要犹豫,看看记录器,看看你的文档是如何构建的 ;-)
  • "Test\r\r###\r\rTest" - 这是段落的构建方式,因此 el[j]=='###' 不起作用。我一直在调查这个......
  • 'Google Documents' 每次使用 'enter' 强制换行时都会创建段落(只需查看上面链接中的示例)
  • 对...2012 年 6 月...我真的不记得它是什么,也不知道它在哪里...太糟糕了 :-)
猜你喜欢
  • 2011-09-28
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多