1

findText の結果から段落の途中に画像を挿入しようとしていますが、段落の前に他の画像があるとうまくいきません。

現在、私のコード(この質問への回答に部分的に基づいています)は、挿入する必要がある場所を見つけてから、findText()が返した段落の子インデックスを取得することで機能します。ただし、インライン画像がある場合、chid インデックスは段落の開始として返されますが、findText からのオフセットは、段落の開始ではなく、画像の終了からの文字です。

スクリプトの関連部分は次のとおりです。

function placeImage(start, end) {
  var d = DocumentApp.getActiveDocument()
  var s = d.getBody();

  var logoResult = s.findText(start);
  var placeHolderStart = logoResult.getStartOffset(); //position of image insertion
  var logoResult2 = s.findText(end, logoResult);
  var placeHolderEnd = logoResult2.getStartOffset(); //text between placeHolderStart and placeHolderEnd will be permanently deleted

  var textElement = logoResult.getElement();
  var paragraph= textElement.getParent();
  var childIndex = paragraph.getParent().getChildIndex(paragraph);  //gets paragraph number

  var par = s.getChild(childIndex).asParagraph(); //entire paragraph containing point of insertion
  var parcopy = par.copy();
  var totalLen = par.editAsText().getText().length-1;

  par.editAsText().deleteText(placeHolderStart, totalLen); //delete all text after insertion point; some will be added back later from parcopy
  parcopy.editAsText().deleteText(0, placeHolderEnd + 1); //this would be the remaining text that gets pasted at the end

  var resp = UrlFetchApp.fetch("https://www.google.com/images/srpr/logo11w.png");
  var logoBlob = resp.getBlob();
  var img = s.getChild(childIndex).appendInlineImage(logoBlob);
  var toMerge = s.insertParagraph(childIndex+1, parcopy);
  toMerge.merge();
  return 1;
}
4

1 に答える 1

2

段落には、テキストや画像の文字列など、複数の子要素が含まれます。ドキュメント内の段落のインデックスではなく、段落内のテキスト要素のインデックスを取得する必要があります。これを試して

function placeImage(start, end) {
  var d = DocumentApp.getActiveDocument()
  var s = d.getBody();

  var logoResult = s.findText(start);
  var placeHolderStart = logoResult.getStartOffset(); //position of image insertion
  var logoResult2 = s.findText(end, logoResult);
  var placeHolderEnd = logoResult2.getEndOffsetInclusive(); //text between placeHolderStart and placeHolderEnd will be permanently deleted

  var textElement = logoResult.getElement(); 
  var text = textElement.getText();
  var paragraph = textElement.getParent();
  var childIndex = paragraph.getChildIndex(textElement);  //gets index of text element in paragaph

  var textSecondHalf = text.substring(placeHolderEnd + 1);
  textElement.deleteText(placeHolderStart, text.length-1);
  paragraph.insertText(childIndex+1, textSecondHalf);

  var resp = UrlFetchApp.fetch("https://www.google.com/images/srpr/logo11w.png");
  var logoBlob = resp.getBlob();
  paragraph.insertInlineImage(childIndex+1, logoBlob);
}
于 2015-06-03T01:57:25.663 に答える