web-dev-qa-db-ja.com

Googleドキュメント内の画像へのすべてのリンクを実際の画像で変換します

テキストの段落と次の形式の複数のドライブリンクを含むGoogleドキュメントをいくつか持っています。

https://drive.google.com/open?id=XXXX

スクリプトを使用して、Google Doc内のすべてのリンクを、リンクの直接の画像に置き換えるにはどうすればよいですか?

1
Curious

この目的のためのスクリプトを次に示します。 findTextメソッドを使用してリンクを見つけます。リンクが見つかると、それを含む要素が検査されます。そのテキストコンテンツは、今度はプレーンJavaScriptの文字列matchメソッドを使用して、リンク形式と再度照合されます。その理由は、findTextは実際に一致したコンテンツを取得する簡単な方法を提供しないためです...

とにかく、text.matchからIDが取得されると、画像が取得され、要素の親に追加されます。ロジックは、見ている要素はおそらくテキストであり、テキストには他の要素を含めることはできないということです。そのため、代わりに親(おそらくParagraph)が使用されます。

appendInlineImageメソッドは、段落の最後に追加します。 insertInlineImage もあります。これにより、より細かい位置決めが可能になりますが、テキストオフセットではなく、要素インデックスの観点から機能します。私の理解では、URLが見つかった場所に画像を直接挿入するには、元のText要素を2つに置き換えて、2つの部分の間に画像を配置する必要があります。これは私には複雑すぎるように思えたので、appendInlineImageに残しました。

最後に、一致するすべてのURLがreplaceTextメソッドで削除されます。

function replaceLinksByImages() {
  var searchPattern = "https://drive.google.com/open\\?id=\\w+";
  var body = DocumentApp.getActiveDocument().getBody();
  var found = body.findText(searchPattern); 
  while (found) {
    var elem = found.getElement();
    var text = elem.getText();
    var match = text.match(/https:\/\/drive.google.com\/open\?id=(\w+)/);
    if (match) {
      var id = match[1];
      var image = DriveApp.getFileById(id).getBlob();
      elem.getParent().appendInlineImage(image);
    }
    found = body.findText(searchPattern, found);
  }
  body.replaceText(searchPattern, "");
}
1
user135384

@FTPに感謝します。 「-」文字を含むアドレスと画像のサイズ変更でいくつかの問題が発生していたため、次のコードを追加することになりました。

function replaceLinksByImages(){
  var searchPattern = "https://drive.google.com/open\?id=\S+";
  var body = DocumentApp.getActiveDocument().getBody();
  var found = body.findText(searchPattern); 
  while (found) {
    var elem = found.getElement();
    var text = elem.getText();
    var match = text.match(/https://drive.google.com/open\?id=([\w-]+)/);
    if (match) {
      var id = match[1];
      var image = DriveApp.getFileById(id).getBlob();
      var appendImage = elem.getParent().appendInlineImage(image);
      var width = appendImage.getWidth()
      var height = appendImage.getHeight()
      var ratio = width/height
      var NewH = 640/ratio

appendImage.setWidth(640).setHeight(NewH) } found = body.findText(searchPattern, found); } body.replaceText(searchPattern, ""); }

再度、感謝します。

0
Curious