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

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

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

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

1回答

10944閲覧

GASでメール送信する際に、添付ファイル(Excel・Word)を付けたい。

yoga

総合スコア10

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

1クリップ

投稿2019/02/20 05:29

前提・実現したいこと

業務でメール配信機能が必要になりスプレッドシートを使用して作成しております。
(プログラミングは初心者です)

現在、こちらを参考に作成中です。
参考サイト→https://news.mynavi.jp/article/appsscript-3/

【実現したいこと】
スプレッドシートのセルに入力されている、フォルダ名/ファイル名から添付ファイルを送付したいです。
例)C5セルに、「フォルダ名/ファイル名」で入力されいてる状態。

・Googledriveに保存された、Excel・Wordなどのファイルを添付ファイルにしたい。
※Googleドキュメント(スプレッドシート、ドキュメント等)ではないです。

・Excel、Wordファイルを添付できればいいので、絶対Googledriveに保存しなければならない訳ではない。
→PCのローカルからの添付でも問題ありません。

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

メール自体は送信できるが、添付ファイルが取得できない。

該当のソースコード

//------------- (3)Google Driveから添付ファイルを取得 ----------------------- // 添付ファイル用の配列を作成 var attachmentFiles = new Array(); // 添付ファイル1を取得 var attachment1_Id = sheetMailHonbun.getRange(6, 3).getValue(); var attachment1; var attachment1_URL = ""; if (attachment1_Id != "") { // Google Driveから添付ファイルのデータを取得 var attachment1 = DocsList.getFileById(attachment1_Id).getBlob(); if (attachment1 != null) { // Gmail添付用のデータを作成(ファイル名、mimeタイプ、バイト配列を指定) attachmentFiles.push({fileName:attachment1.getName(), mimeType: attachment1.getContentType(), content:attachment1.getBytes()}); attachment1_URL = DocsList.getFileById(attachment1_Id).getUrl(); } }

試したこと

var folder = DriveApp.getFolderById(ID); folder.getFileByName(ファイル名).next();

このあたりの機能を使用して実装すればいいのかと思うのですが、使い方が良くわからず、何か方法がありましたらご教授くださいませ。

プログラミング自体がまだよくわかっていないため、見当はずれな質問でしたら申し訳ございません。

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

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

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

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

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

guest

回答1

0

C5セルに、「フォルダ名/ファイル名」で入力されいてる状態

javascript

1sheetMailHonbun.getRange(6, 3).getValue();

ここのところC6なんで、6じゃなくて、5にしてもらっていいですか?

あと「ファイルID」を書いてください。「フォルダ名/ファイル名」みたいなのを解釈するコードはハードル高いので。


別に難しくはないです。ハードルが高いと思います、質問者様には。

javascript

1const fileByName = "フォルダ/ファイル.xlsx"; 2//const fileByName = sheet.getRange("C5").getValue(); 3const folderandfile = fileByName.Split("/"); 4const folder = DriveApp.getFoldersByName(folderandfile[0]).next(); 5const fileBlob = foldr.getFilesByName(folderandfile[1]).next().getBlob();

「弊社の業務の必要にあわせて作ってください」っていうことですよね

投稿2019/02/20 06:06

編集2019/02/20 08:04
papinianus

総合スコア12705

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

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

yoga

2019/02/20 07:39

コメントありがとうございます。 6→5に変更してみましたが、ダメでした。 「ファイルID」は、スプレッドシートだと、 spreadsheets/d/************************/edit#gid=0 この「*」のことで合っていますでしょうか? googleドライブにExcelをアップロードしている状態なので、ファイルIDが分かりません。 「共有可能なリンクを取得」した際URLとかではないですよね? https://drive.google.com/file/d/*********************/view?usp=sharing 「フォルダーID」であればわかります。 フォルダに添付したいファイルだけ保存しておき、フォルダ内のすべてのファイルを添付するという形でも問題ないのですが、なにか方法ありますでしょうか。。
yoga

2019/02/20 07:53

https://qiita.com/horikeso/items/4255e5412e4734661a7a こちらのページの添付ファイルの取得先を sheetMailHonbun.getRange(5, 3).getValue(); にできれば可能なのかな?と思うのですが、そんな簡単なものでもないですかね。。 // 添付ファイル var fileBlobList = []; for (var n = 0; n < attachmentData.length; ++n) { var attachmentString = attachmentData[n][0]; var attachmentPathParts = attachmentString.split("/"); Logger.log("attachmentPathParts : " + attachmentPathParts); var folder = null; var partsIndex = 0; while (partsIndex < attachmentPathParts.length - 1) { var folders = null; if (folder === null) { folders = DriveApp.getFoldersByName(attachmentPathParts[partsIndex]); } else { folders = folder.getFoldersByName(attachmentPathParts[partsIndex]); } while (folders.hasNext()) { folder = folders.next(); } partsIndex++; } Logger.log("folder : " + folder); var files = null; if (folder === null) { files = DriveApp.getFilesByName(attachmentPathParts[partsIndex]); } else { files = folder.getFilesByName(attachmentPathParts[partsIndex]); } while (files.hasNext()) { fileBlobList.push(files.next().getBlob());// BlobSource[] } Logger.log("fileBlobList : " + fileBlobList); } }
papinianus

2019/02/20 07:58 編集

共有リンクのidであってるはずなんですが、プレビュー画面から取得したリンクだとspreadsheetに一時的に変換されたものの可能性があります。 名前から得る方法はこれでできると思いますよ。ここまで分かってるなら作ればいいのではないでしょうか?
yoga

2019/02/20 10:07

ご確認ありがとうございます。 見よう見まねで作っては見たのですが、やはり添付がうまくいきません。。 添付以外のメール送信はできるのですが、何か記述おかしいでしょうか。。 ご助言頂けたら幸いです。 //------------- (3)Google Driveから添付ファイルを取得 ----------------------- // 添付ファイル用の配列を作成 var attachmentFiles = new Array(); // 添付ファイルを取得 var attachmentData = sheetMailHonbun.getRange(5, 3).getValue(); Logger.log(attachmentData); // 添付ファイル var fileBlobList = []; for (var n = 0; n < attachmentData.length; ++n) { var attachmentString = attachmentData[n][0]; var attachmentPathParts = attachmentString.split("/"); Logger.log("attachmentPathParts : " + attachmentPathParts); var folder = null; var partsIndex = 0; while (partsIndex < attachmentPathParts.length - 1) { var folders = null; if (folder === null) { folders = DriveApp.getFoldersByName(attachmentPathParts[partsIndex]); } else { folders = folder.getFoldersByName(attachmentPathParts[partsIndex]); } while (folders.hasNext()) { folder = folders.next(); } partsIndex++; } Logger.log("folder : " + folder); var files = null; if (folder === null) { files = DriveApp.getFilesByName(attachmentPathParts[partsIndex]); } else { files = folder.getFilesByName(attachmentPathParts[partsIndex]); } while (files.hasNext()) { fileBlobList.push(files.next().getBlob());// BlobSource[] } Logger.log("fileBlobList : " + fileBlobList); } //------------- (4)メール送信処理 ----------------------- for (var i = start;i <= numRows;i++) { // 対象行の差込データを取得 var sasikomiData1 = sheetAtesakiList.getRange(i, 3).getValue(); var sasikomiData2 = sheetAtesakiList.getRange(i, 4).getValue(); var sasikomiGoSubject = subject; var sasikomiGoBody = body; // 会社名が入力されている場合は、差込処理を行う(件名+本文) if (sasikomiData1 != "") { sasikomiGoSubject = sasikomiGoSubject.replace("{{会社名}}", sasikomiData1, "g"); sasikomiGoBody = sasikomiGoBody.replace("{{会社名}}", sasikomiData1, "g"); } // 差込データ2が入力されている場合は、差込処理を行う if (sasikomiData2 != "") { sasikomiGoSubject = sasikomiGoSubject.replace("{{担当者名}}", sasikomiData2, "g"); sasikomiGoBody = sasikomiGoBody.replace("{{担当者名}}", sasikomiData2, "g"); } // 対象行の宛先を取得 var strTo = sheetAtesakiList.getRange(i, 2).getValue(); // メールを送信(添付ファイルがある場合とない場合で処理分け) if (attachmentFiles.length > 0) { GmailApp.sendEmail( strTo, //toアドレス sasikomiGoSubject, //表題 sasikomiGoBody, //本文 {attachments:[attachmentFiles]}, //添付ファイル { from: strFrom, //fromアドレス name: strSender //差出人 } ); } else { GmailApp.sendEmail( strTo, //toアドレス sasikomiGoSubject, //表題 sasikomiGoBody, //本文 { from: strFrom, //fromアドレス name: strSender //差出人 } ); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問