質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

2334閲覧

Google Apps ScriptでGoogleスライドを編集したい

Azamaro

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2021/03/31 17:00

編集2021/03/31 17:01

前提・実現したいこと

スプレッドシートのデータを元に、Googleスライドのシェイプ内の文字列を置換してくれるようにしたい。

発生している問題・エラーメッセージ

for分で繰り返し処理を行って置換をしているのですが、繰り返し処理の最後の部分だけが置換されてしまう。
下の画像のように、スプレッドシートのデータを元に置換を行いたいのですが、繰り返し処理の一番最後の部分(g→Gの置換)だけが実行されてしまう状況です。
スプレッドシート
スライド

該当のソースコード

JavaScript

1function replaceShapeString(){ 2 3 var url ='スライドのURL'; 4 var presentation = SlidesApp.openByUrl(url); 5 6 var sheet = SpreadsheetApp.openById('スプレッドシートのID').getSheetByName('シート名') 7 var values= sheet.getRange('範囲').getValues(); 8 var lastRow = sheet.getLastRow(); 9 10 11 for(var i = 2; i <= lastRow; i++) { 12 var id = (sheet.getRange(i, 1).getValues()); 13 } 14 15 for(var i = 2; i <= lastRow; i++) { 16 var pattern = (sheet.getRange(i, 2).getValues()); 17 } 18 19 for(var i = 2; i <= lastRow; i++) { 20 var replacement = (sheet.getRange(i, 3).getValues()); 21 } 22 23 replaceShapeString_(presentation, id, pattern, replacement) 24 25 26} 27 28function replaceShapeString_(presentation, id, pattern, replacement){ 29 30 var shape = presentation.getPageElementById(id).asShape(); 31 var str = shape.getText().asString(); 32 str = replaceInBrace_(str, pattern, replacement); 33 shape.getText().setText(str); 34 35} 36 37function replaceInBrace_(str, pattern, replacement){ 38 39 pattern = '{' + pattern + '}'; 40 str = str.replace(pattern, replacement); 41 return str; 42 43} 44

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

JavaScript

1 for(var i = 2; i <= lastRow; i++) { 2 var id = (sheet.getRange(i, 1).getValues()); 3 }

上記でループする度にidの値を書き換えているため、最後のループ(i = 8)の場合の値になるためです。(patternreplacementも同じ)

こうすればいいかと思います。

JavaScript

1 for (let row = 2; row <= lastRow; row++) { 2 const id = sheet.getRange(row, 1).getValue(); 3 const pattern = sheet.getRange(row, 2).getValue(); 4 const replacement = sheet.getRange(row, 3).getValue(); 5 replaceShapeString_(presentation, id, pattern, replacement); 6 }

本題とは関係ないですが、スプレッドシートはセルごとにgetRange()するより全体を配列で取得してループした方がいいです。

JavaScript

1 const values = sheet.getDataRange().getValues().slice(1); 2 for (const [id, pattern, replacement] of values) { 3 replaceShapeString_(presentation, id, pattern, replacement); 4 }

投稿2021/03/31 20:31

draq

総合スコア2577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Azamaro

2021/03/31 21:56

回答してくださり、ありがとうございます。 ご教示いただいたコードで実行した結果、うまく置換されました。 しかし、上で示したスプレッドシート上に追加で「h→H」を置換するように記述したところ、「TypeError: Cannot read property 'asShape' of null」と出てしまいました。
draq

2021/03/31 22:06

presentation.getPageElementById(id) が null を返しているってことなので、スプレッドシートに入力しているidが間違っているのでしょう。
Azamaro

2021/04/01 00:58

すみません、初歩的なミスをしていました。 回答してくださり、ありがとうございました。解決策、アドバイスともに大変助かりました!
guest

0

gas

1 for(var i = 2; i <= lastRow; i++) { 2 (処理1) 3 } 4 for(var i = 2; i <= lastRow; i++) { 5 (処理2) 6 } 7 (処理3)

このコードの意味は(処理1)を繰り返し行い、その後に(処理2)を繰り返し行いその後に(処理3)を一度だけ行う。という意味です。

各行で、ある列の値を三つ取得し変換する、のであれば

gas

1 for(var i = 2; i <= lastRow; i++) { 2 (一つ目取得) 3 (二つ目取得) 4 (三つ目取得) 5  (変換処理) 6 }

とする必要があります。

投稿2021/03/31 20:00

xail2222

総合スコア1508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問