🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

8245閲覧

GAS スライドをページごとに画像化してGoogle ドライブに保存する方法について

s.kono

総合スコア37

Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2019/10/21 06:04

編集2019/10/23 07:00

Google Apps Script でGoogleドライブにあるスライドやパワーポイントの1スライドを自動で画像化して同じフォルダに保存したいです。
こちらのサイトを参考にというか、ほぼ同じchordなのですが以下のエラーが出て実現できません。
事前準備としてOAuth2 for Apps Scriptのライブラリを有効化しています。

参考サイト:https://codeday.me/jp/qa/20190305/364927.html
エラー:text/html から image/png への変換はサポートされていません。

ご教示よろしくお願いします。

javascript

1/* 参考サイト 2https://codeday.me/jp/qa/20190305/364927.html 3*/ 4function main(){ 5 var id=PropertiesService.getScriptProperties().getProperty('slide_id'); 6 downloadPresentation(id) 7} 8 9function downloadPresentation(id) { 10 var slideIds = getSlideIds(id); 11 12 for (var i = 0, slideId; slideId = slideIds[i]; i++) { 13 downloadSlide('Slide ' + (i + 1), id, slideId); 14 } 15} 16 17function downloadSlide(name, presentationId, slideId) { 18 var url = 'https://docs.google.com/presentation/d/' + presentationId + 19 '/export/png?id=' + presentationId + '&pageid=' + slideId; 20 var options = { 21 "muteHttpExceptions" : true,  //エラー捕捉 22 headers: { 23 Authorization: 'Bearer ' + ScriptApp.getOAuthToken() 24 } 25 26 }; 27 try { 28 //成功時 29 var response = UrlFetchApp.fetch(url, options); 30 var image = response.getAs(MimeType.PNG);//←text/html から image/png への変換はサポートされていませんとエラーになります 31 image.setName(name); 32 DriveApp.createFile(image); 33 } catch(e) { 34 //エラー時 35 Logger.log(e.message); 36 } 37 38} 39 40function getSlideIds(presentationId) { 41 42 var url = 'https://slides.googleapis.com/v1/presentations/' + presentationId; 43 var options = { 44 "muteHttpExceptions" : true, //エラー捕捉 45 headers: { 46 Authorization: 'Bearer ' + ScriptApp.getOAuthToken() 47 } 48 }; 49 try{ 50 var response = UrlFetchApp.fetch(url, options); 51 } catch(e) { 52 //エラー時 53 Logger.log(e.message); 54 } 55 var slideData = JSON.parse(response); 56 return slideData.slides.map(function(slide) { 57 return slide.objectId; 58 }); 59 60} 61 62

結論としては
エラーはchordによるエラーではなく、環境回りの設定がうまくいっていなかったということでした。
最終的にはマイドライブに保存された画像ファイルを元スライドにあるフォルダに移動する部分も追加した次のコードでうまく動いています。

不要だったもの

  • OAuth2ライブラリの追加

- Google Slides API

Google

1/* 参考サイト 2https://medium.com/@gw_cule/gas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E8%AA%8D%E5%8F%AF%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-67f195d7a425 3https://codeday.me/jp/qa/20190305/364927.html 4*/ 5function main(){ 6 var id=PropertiesService.getScriptProperties().getProperty('slide_id'); 7 var folderid=PropertiesService.getScriptProperties().getProperty('folder_id'); 8 downloadPresentation(id,folderid) 9} 10 11function downloadPresentation(id,folderid) { 12 var slideIds = getSlideIds(id); 13 14 for (var i = 0, slideId; slideId = slideIds[i]; i++) { 15 var file = downloadSlide('Slide ' + (i + 1), id, slideId); 16 moveSlides(file,folderid); 17 } 18} 19 20function downloadSlide(name, presentationId, slideId) { 21 22 var url = 'https://docs.google.com/presentation/d/' + presentationId + 23 '/export/png?id=' + presentationId + '&pageid=' + slideId; 24 var options = { 25 "muteHttpExceptions" : true,  //エラー捕捉 26 headers: { 27 Authorization: 'Bearer ' + ScriptApp.getOAuthToken() 28 } 29 }; 30 try { 31 //成功時 32 var response = UrlFetchApp.fetch(url, options); 33 var image = response.getAs(MimeType.PNG); 34 image.setName(name); 35 var file=DriveApp.createFile(image); 36 return file; 37 } catch(e) { 38 //エラー時 39 Logger.log(e.message); 40 } 41 42} 43 44function getSlideIds(presentationId) { 45 46 var url = 'https://slides.googleapis.com/v1/presentations/' + presentationId; 47 var options = { 48 "muteHttpExceptions" : true, //エラー捕捉 49 headers: { 50 Authorization: 'Bearer ' + ScriptApp.getOAuthToken() 51 } 52 }; 53 try{ 54 var response = UrlFetchApp.fetch(url, options); 55 } catch(e) { 56 //エラー時 57 Logger.log(e.message); 58 } 59 var slideData = JSON.parse(response); 60 return slideData.slides.map(function(slide) { 61 return slide.objectId; 62 }); 63 64} 65 66function moveSlides(file,folderid){ 67 68 var folder = DriveApp.getFolderById(folderid); 69 file.makeCopy(file.getName(),folder);//ルート(マイドライブ直下)に作られた画像ファイルをコピーする 70 Logger.log(file.getName() + ": this file delete"); 71 file.setTrashed(true); 72 73} 74

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

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

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

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

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

guest

回答1

0

ベストアンサー

私の環境では、スクリプトのプロパティに`slide_id'を追加してidを設定するだけで、画像が出力されました。

text/html から image/png への変換はサポートされていませんとでるということは、対象のSlidesを参照する権限がない等の理由で、テキストページに飛ばされているとかじゃないでしょうか。

投稿2019/10/21 16:09

draq

総合スコア2577

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

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

s.kono

2019/10/23 01:05

ご回答ありがとうございます。 対象のスライドはマイドライブにある自身が作ったスライドです。この場合に保存先はどこになるのかよくわからないのですが、もしかするとマイドライブの直下や元スライドのあるフォルダではなく、ローカルPCのダウンロードフォルダということですと権限がないということは考えられます。 draqさんはどこに出力されましたでしょうか? 教えていただけますと助かります。
draq

2019/10/23 01:14

スライドと同じフォルダに出力されました。 このスクリプトはGoogle Driveに保存しているので、ローカルPCは関係ないかと思います。 Logger.log等で(text/html)な出力の内容を確認してみてはどうでしょうか。
s.kono

2019/10/23 01:29

スライドと同じフォルダに保存したたかったのでありがたいchordなのですが、私の環境ではうまくいっていないのですね。Logger.logの中身は ----- [19-10-23 10:24:33:240 JST] <HTML> <HEAD> <TITLE>Unauthorized</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> <H1>Unauthorized</H1> <H2>Error 401</H2> </BODY> </HTML> [19-10-23 10:24:33:241 JST] text/html から image/png への変換はサポートされていません。 [19-10-23 10:24:33:551 JST] <HTML> ----- でした。デバックでurlの変数の中身をアドレスにたたくと直後ローカルに保存されます。
draq

2019/10/23 01:47

GASを動かすアカウントとGoogle Driveのアカウントが別だったりしませんか。 Googleアカウントのページを開いて、スクリプトへGoogle Slidesへのアクセスが許可されているか確認してください。
s.kono

2019/10/23 02:41

回答ありがとうございます。職場のG-Suiteなのですがアカウントはドライブもスライドも同じアカウントです。 OAuth 2.0の認証とは何か関係あるのでしょうか? ライブラリだけ有効にすればGASからの場合必要ないと思っていますがそのあたりの理解が不足しているせいで切り分けが出来ていないかもしれません。 該当のプロジェクトのプロパティ このスクリプトで必要な 2 個の OAuth スクリプト: https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/script.external_request とあります。 appsscript.jsonには { "timeZone": "Asia/Tokyo", "dependencies": { "libraries": [{ "userSymbol": "OAuth2", "libraryId": "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF", "version": "35", "developmentMode": true }] }, "exceptionLogging": "STACKDRIVER", "oauthScopes": ["https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/presentations"] } 何か関係ありますでしょうか?
draq

2019/10/23 02:57

私の環境では、特に追加のライブラリの設定等はしていません。 appscript.jsonもこれだけです。 --- { "timeZone": "Asia/Tokyo", "dependencies": { }, "exceptionLogging": "STACKDRIVER" } ---
draq

2019/10/23 03:04

https://qiita.com/tanaike/items/b3538e7550555ebb51f5 の追記1に「oauthScopes[]へスコープを登録すると、すでに認証していたとしても登録したスコープ以外は使用できなくなるので注意が必要です。」とあるので、試しにoauthScopesを削除して見てはどうでしょうか。
s.kono

2019/10/23 05:02

色々教えていただきありがとうございます。 新しいファイルに同じスクリプトを書いて実行したところ 何回か次のエラーで失敗しいてたのですが TypeError: undefined のメソッド「map」を呼び出せません。 at getSlideIds(コード:58) at downloadPresentation(コード:11) at main(コード:7) 何回目かで特になにもしていないのに マイドライブに画像が保存されていました。 元々遅延か何かが原因でエラーになっていたのをいじりすぎていたのでしょうか。 Google Slides API もOAuth2.0も必要なかったのかもしれません。 保存先をマイドライブをスライドのあったドライブに変更する必要はありますが正常に動いているということでしょうか。
s.kono

2019/10/23 07:02

ありがとうございました。おかげさまで解決できました。今後はエラーの特定を慎重にするようにしてあまり環境回りをよく理解しないまま直さないことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問