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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1260閲覧

Googleスプレッドシートのグラフを画像で保存したいがGoogle Drive内にファイルが作成されない

umako1112

総合スコア1

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2023/01/09 12:04

編集2023/01/10 05:16

質問内容

主婦ですが、趣味でLINEとGASを連携させた家計簿を作っております。
Googleスプレッドシートで作成したグラフをLINEに送信したいです。
Google Driveに一時的に画像ファイルとして保存して送信するつもりなのですが、
送信以前にGoogle Driveに画像ファイルが作成されなくて困っています。
送信したいグラフは複合グラフです。
イメージ説明
試しにGoogle Drive内にテキストファイルを作成してみたら、きちんとできたのでおそらくgetChart前後の問題かと思っております。
いろいろなサイトを調べて記述を変えたりもしましたが、手詰まりとなってしまいましたのでどなたかご教授いただけますと幸いです。

よろしくお願いいたします。

該当ソースコード

GAS

1 var chart = sheet.getCharts(); 2 var chartImage = chart[0].getAs('image/png').setName("グラフ.png"); 3 4 //Google Driveのフォルダにグラフを画像として格納 5 var folderId = 'Google DriveのフォルダーID'; 6 var folder = DriveApp.getFolderById(folderId); 7 var file = folder.createFile(chartImage);

コード全文

GAS

1 2//アクセストークン 3var ACCESS_TOKEN = "アクセストークン"; 4 5//スプレッドシートID 6var id = "スプレッドシートID"; 7 8//LINE_BOT返信用エンドポイント 9var replyUrl = "https://api.line.me/v2/bot/message/reply"; 10 11//LINE_BOTメッセージプッシュ用エンドポイント 12var pushUrl = 'https://api.line.me/v2/bot/message/push'; 13 14//家計簿LINEのグループID(グラフの送信先として指定) 15var to = 'LINEグループID'; 16 17//分岐した際最終的にラインに返信する文章 18var text; 19 20 21/* メッセージがポストされた際の動作 */ 22function doPost(e){ 23 //JSONにパースする 24 var json = JSON.parse(e.postData.contents); 25 26 //送られたLINEメッセージを取得 27 var message = json.events[0].message.text; 28 29 //メッセージの配列化 30 var array = message.split(/\n/); 31 32 //日付取得・シート名取得 33 var date = new Date(); 34 var sendDate = Utilities.formatDate(date,'Asia/Tokyo','M月dd日'); 35 var sheetName = String(Utilities.formatDate(date,'Asia/Tokyo','yyyy/M')); 36 var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName); 37 38 var item = sheet.getRange('L5:L15').getValues(); //項目名の配列 39 40 //入力されたメッセージによって動作を分岐 41 if(item.indexOf(array[0]) && Number.isInteger(Number(array[1]))){ //「1行目の文字が配列内にある」かつ「2行目が整数」 42 43 //スプレッドシートの最終行を取得 44 var lastRow = sheet.getRange(3,3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 45 46 //スプレッドシートにLINEの内容を登録 47 sheet.getRange(lastRow+1,3).setValue(sendDate); 48 sheet.getRange(lastRow+1,4).setValue(array[0]); 49 sheet.getRange(lastRow+1,5).setValue(array[1]); 50 sheet.getRange(lastRow+1,6).setValue(array[2]); 51 52 //登録が正常に行われた際にメッセージを返信 53 text = '日付:'+String(sendDate)+'\n項目:'+String(array[0])+'\n金額:'+String(array[1])+'\n備考:'+String(array[2])+'\n\n上記内容で登録しといたで'; 54 55 }else if(array == 'グラフ'){ 56 57 //シートにあるグラフを配列に格納 58 var chart = sheet.getCharts(); //getchartがおかしいはず。わからん。 59 var chartImage = chart[0].getAs('image/png').setName("グラフ.png"); 60 61 //Google Driveのフォルダにグラフを画像として格納 62 var folderId = 'フォルダーID'; 63 var folder = DriveApp.getFolderById(folderId); 64 var file = folder.createFile(chartImage); 65 66 //画像を公開設定に変更 67 file.setSharing(DriveApp.Access.ANYONE,DriveApp.Permission.EDIT); 68 69 //画像を関数でラインに送信し、画像を削除 70 pushImage(to,file.getDownloadUrl(),file.getDownloadUrl()); 71 DriveApp.getFolderById(folderId).removeFile(file); 72 73 }else{ 74 75 text = '入力が間違っています!'; 76 77 } 78 79 80 //textの内容をLINEに返信する 81 var replyToken= json.events[0].replyToken; 82 83 if(typeof replyToken === 'undefined'){ 84 return; 85 } 86 87 var messages = [{ 88 'type': 'text', 89 'text': text, 90 }]; 91 92 UrlFetchApp.fetch(replyUrl,{ 93 'headers': { 94 'Content-Type': 'application/json; charset=UTF-8', 95 'Authorization': 'Bearer ' + ACCESS_TOKEN, 96 }, 97 'method': 'post', 98 'payload': JSON.stringify({ 99 'replyToken': replyToken, 100 'messages': messages, 101 }), 102 }); 103 104 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 105} 106 107 108//グラフ画像をLINEグループに送信する関数 109function pushImage(to,src,srcPreview){ 110 111 var headers = { 112 "Content-Type" : "application/json; charset=UTF-8", 113 'Authorization': 'Bearer ' + ACCESS_TOKEN, 114 }; 115 116 var postData = { 117 "to" : to, 118 "messages" : [ 119 { 120 'type':'image', 121 'originalContentUrl':src, 122 'previewImageUrl':srcPreview, 123 } 124 ] 125 }; 126 127 var options = { 128 "method" : "post", 129 "headers" : headers, 130 "payload" : JSON.stringify(postData) 131 }; 132 133 return UrlFetchApp.fetch(pushUrl, options); 134 135}

複合グラフで実行した場合エラーが出てしまいました。
イメージ説明

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

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

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

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

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

jhashimoto

2023/01/09 17:37

エラーは出力されていますか?
jhashimoto

2023/01/09 17:41

提示されたコードに変数sheetの宣言が含まれていないため、こちらで動作確認ができません。該当Functionのコードをすべて質問文に記載してもらえないでしょうか。
umako1112

2023/01/10 01:15

コメントおよびご回答ありがとうございます!! エラーは出力されておりません。 本文内にソースコード全文を追記させていただきました。
jhashimoto

2023/01/10 03:06

自分のお願いの仕方がまずかったです。こちらで動作確認したかったので、sheet変数の宣言まで含んだコードを提供してほしかったのです。1つのFunction内でLINEへの送信までやっているとは想定してませんでした(Driveにグラフ画像を作成するだけだと思っていました)。LINEの動作環境がありませんし、現状提示されたコードだとこちらで動作確認はできないです。
umako1112

2023/01/10 05:11

確かにその通りですね...。 大変申し訳ありません。
guest

回答1

0

ベストアンサー

提示されたコードで、グラフ画像がドライブに作成されることを確認しました。

イメージ説明

グラフ化したデータ。

2001年2002年2003年
売上100020003000
利益100200300

変数の宣言を追加していますが、他は変更していません。

JavaScript

1function myFunction() { 2 // ここから追加 3 var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet = spreadSheet.getActiveSheet(); 5 // ここまで追加 6 7 var chart = sheet.getCharts(); 8 var chartImage = chart[0].getAs('image/png').setName("グラフ.png"); 9 10 //Google Driveのフォルダにグラフを画像として格納 11 var folderId = 'Google DriveのフォルダーID'; 12 var folder = DriveApp.getFolderById(folderId); 13 var file = folder.createFile(chartImage); 14}

コードは問題ないとすると、権限の不足が考えられます。Googleドライブへのアクセスは許可されていますか?こちらで実行したときは、許可が求められました。

イメージ説明

投稿2023/01/09 18:03

編集2023/01/09 18:30
jhashimoto

総合スコア838

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

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

umako1112

2023/01/10 01:36 編集

ご回答ありがとうございます。 一度このコード内でテキストファイルを作成した際は正常にできたので、アクセス権は許可されていると認識しておりました...。 実行の際に添付して下さった画像のようなポップアップも出ませんでした。 新しいスプレッドシートを作成し、権限の許可もしてみましたがうまくいかずでした...。 申し訳ありません。
jhashimoto

2023/01/10 03:08

本文にテキストファイルは作成できていると書かれていたので、アクセス権はありますね。失礼しました。
jhashimoto

2023/01/10 03:10 編集

「試しにGoogle Drive内にテキストファイルを作成してみたら、きちんとできたのでおそらくgetChart前後の問題かと思っております」。getChartがあやしいと予想しているなら、ミニマムコードで検証すればよいでしょう。getChartの処理を切り出したコードが期待どおりに動作するかどうかで、原因箇所の切り分けにつながります。今回は自分の回答がミニマムコードになっていますので、コピペして、ご自身の環境で動作するか確認してみるとよいと思います。(そういう意図でグラフ化したデータも載せています)
umako1112

2023/01/10 05:14

アドバイスいただいた通りミニマムコードでgetchartのみを実行してみました! jhashimotoさんが載せてくださったような簡単なグラフだったら無事Google Driveに保存することができました! ただ私が本文内に載せた複合グラフが悪いのか、どうやらgetAsでエラーが出てしまっているようです...。 本文内にエラーログも一応追加しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問