テキストの段落と次の形式の複数のドライブリンクを含むGoogleドキュメントをいくつか持っています。
https://drive.google.com/open?id=XXXX
スクリプトを使用して、Google Doc内のすべてのリンクを、リンクの直接の画像に置き換えるにはどうすればよいですか?
この目的のためのスクリプトを次に示します。 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, "");
}
@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, "");
}
再度、感謝します。