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

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

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

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

Q&A

解決済

1回答

7469閲覧

GASを使用し、メールの文章などをドライブに自動保存する方法

GAS_syoshinsya

総合スコア6

Google Apps Script

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

1グッド

2クリップ

投稿2020/06/29 02:15

編集2020/06/29 04:57

前提・実現したいこと

gasを使用し、ある特定のメール文をGoogleドライブに自動保存される機能を作成したい。
1.メールの件名を検索
2.メールのデータをPDFにして一件ずつドライブに格納されるように実装
3.かぶりがあれば削除されるようにしたい
4.添付ファイルは保存されなくてもいい(できれば保存されるようにしたい)

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

https://tonari-it.com/gas-gmail-attachment-drive/
こちらを参考にして作成していますが、pushの仕方、for文の回し方。要素の取得法。pushする方法などがあまり理解できず苦しんでいます。

該当のソースコード

const FOLDER_ID = '********'; //フォルダID const SEARCH_TEAM = '***'; //検索タイトル //メイン(メールから添付ファイルを取得) function fetchFile(){ var myThreads = GmailApp.search(SEARCH_TERM, 0, 100); //条件にマッチしたスレッドを検索して取得(0~100件まで) var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納 var valMsgs = []; Logger.log(myMessages[0][0].getSubject()); //取得メールの件名表示 } //フォルダの中に入ってるファイルの名前を取得 function getFileNames(){ var files = FOLDER.getFiles(); var fileNames = [] var count = 0 /* 各メールから日時、送信元、件名、内容、ID、添付ファイルを取り出す */ for (var i = 0; i < myMessages.length; i++) { for (var j = 0; j < myMessages[i].length; j++) { var msid = myMessages[i][j].getId();//メッセージIDを取得 // もしメッセージIDがフォルダに存在しなければ if (!hasId(msid)){ var date = myMessages[i][j].getDate(); var from = myMessages[i][j].getFrom(); var subj = myMessages[i][j].getSubject(); var body = myMessages[i][j].getPlainBody().slice(0, 200); var perm = myThreads[i].getPermalink(); var attach = myMessages[i][j].getAttachments(); var links = ["","",""]; valMessages.push([date,from,subj,body,msid,perm,attach]); } } } while (files.hasNext()) { fileNames[count] = files.next() count++ } return fileNames } //フォルダにあるファイル名が添付ファイル名と同じとき更新 function updateFile(attachments){ var fileNames = getFileNames() for(var i in attachments){ for(var j in fileNames){ //ドライブにすでに同じ名前のファイルがあるか? if(attachments[i].getName() == fileNames[j]){ var files = DriveApp.getFilesByName(fileNames[j])     //重複ファイルを削除 if (files.hasNext()) { var file = files.next() file.setTrashed(true) Logger.log(file.getName()) //削除したファイル名表示 } } } FOLDER.createFile(attachments[i]) //ドライブに添付ファイルを保存 } }

知りたいこと。
1.PDFとしてメールの要素を出力し、フォルダに格納する方法。
2.すでにPDFとして格納されている場合は重複するPDFを削除する機能

DrqYuto👍を押しています

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

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

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

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

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

draq

2020/06/29 04:48

何を聞きたいんでしょうか。何ができていて何ができていないのかよくわかりません。 あとソースコードはコードの挿入(ツールバーの<code>)ボタンを使ってください。
GAS_syoshinsya

2020/06/29 04:57

返信ありがとうございます! 追記いたしました。 よろしければ回答お願いいたします
guest

回答1

0

ベストアンサー

1.PDFとしてメールの要素を出力し、フォルダに格納する方法。

メールの要素の取得は出来てるようなので、PDF化部分だけ。
GASだけだとPDF化できそうに無いので、Google ドキュメントのエクスポート機能を利用して実装してみました。
別のWEBサービスを使ってもいいです。

GoogleAppsScript

1/** 2 * 指定したファイル名でテキストの内容をPDFとして保存する。 3 * 4 * @param {GoogleAppsScript.Drive.Folder} folder ファイルを保存するフォルダ 5 * @param {string} filenameWithoutExtension 保存するファイル名(拡張子なし) 6 * @param {string} text 保存するテキスト 7 */ 8function saveToPdf(folder, filenameWithoutExtension, text) { 9 //Google Document へ一時ファイルとして保存 10 const document = DocumentApp.create(filenameWithoutExtension); 11 const documentId = document.getId(); 12 document.getBody().setText(text); 13 document.saveAndClose(); 14 15 //Google Document から PDF としてエクスポート 16 const options = { 17 exportFormat: "pdf", 18 format: "pdf", 19 }; 20 const parameters = Object.keys(options) 21 .map(key => `${key}=${options[key]}`) 22 .join("&"); 23 24 const url = `https://docs.google.com/document/d/${documentId}/export?${parameters}`; 25 const response = UrlFetchApp.fetch(url, { 26 "headers": { 27 Authorization: `Bearer ${ScriptApp.getOAuthToken()}`, 28 }, 29 "method": "GET", 30 "Content-Type": "application/pdf", 31 }); 32 33 const blob = response.getBlob().setName(filenameWithoutExtension + ".pdf"); 34 folder.createFile(blob); 35 36 //一時ファイルを削除 37 const docFile = DriveApp.getFileById(documentId); 38 DriveApp.removeFile(docFile); 39 //parentFolder.addFile(docFile); //必要なら戻す 40}

2.すでにPDFとして格納されている場合は重複するPDFを削除する機能

GoogleAppsScript

1/** 2 * フォルダから指定の名前のファイルを削除する。 3 * 4 * @param {string} filename 保存するファイル名 5 * @param {GoogleAppsScript.Drive.Folder} folder ファイルを保存するフォルダ 6 */ 7function removeFile(filename, folder) { 8 const iterator = folder.getFilesByName(filename); 9 while(iterator.hasNext()) { 10 folder.removeFile(iterator.next()) 11 } 12}

投稿2020/06/29 06:58

編集2020/06/29 07:31
draq

総合スコア2577

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

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

GAS_syoshinsya

2020/06/29 07:01

すごいですね!!! ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問