Вставьте изображение в указанное место

У меня есть скрипт Служб Google, который заменяет заполнители в копии шаблонного документа некоторым текстом, вызывая 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();      
    }      
  }
}

1 ответ

Решение

Вот фрагмент кода, который делает (примерно) то, что вы хотите.

(возможно, есть и другие способы сделать это, и, безусловно, нужны некоторые улучшения, но общая идея есть)

Я решил использовать "###" в документе, чтобы отметить место, где будет вставлено изображение, изображение должно быть на вашем диске Google (или, точнее, на "каком-то" диске Google). Код ниже использует документ Я поделился и изображение, которым я тоже поделился, так что вы можете попробовать его. Вот ссылка на документ, не забудьте удалить изображение и поставить ### где-нибудь перед тестированием (если кто-нибудь запускал код перед вами;-)

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 
         }
       }
    }
}

РЕДАКТИРОВАТЬ: чтобы этот сценарий работал, строка ### ДОЛЖНА быть одна в своем абзаце, никаких других символов до и после... помните, что каждый раз, когда вы вводите новую строку нажатием клавиши ВВОД, документ создает новый абзац.

Другие вопросы по тегам