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

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

ただいまの
回答率

87.60%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 7,105

score 10

前提・実現したいこと

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

現在、こちらを参考に作成中です。
参考サイト→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();


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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


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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/20 16:39

    コメントありがとうございます。
    6→5に変更してみましたが、ダメでした。

    「ファイルID」は、スプレッドシートだと、
    spreadsheets/d/************************/edit#gid=0
    この「*」のことで合っていますでしょうか?

    googleドライブにExcelをアップロードしている状態なので、ファイルIDが分かりません。
    「共有可能なリンクを取得」した際URLとかではないですよね?
    https://drive.google.com/file/d/*********************/view?usp=sharing


    「フォルダーID」であればわかります。
    フォルダに添付したいファイルだけ保存しておき、フォルダ内のすべてのファイルを添付するという形でも問題ないのですが、なにか方法ありますでしょうか。。

    キャンセル

  • 2019/02/20 16: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);
    }
    }

    キャンセル

  • 2019/02/20 16:57 編集

    共有リンクのidであってるはずなんですが、プレビュー画面から取得したリンクだとspreadsheetに一時的に変換されたものの可能性があります。

    名前から得る方法はこれでできると思いますよ。ここまで分かってるなら作ればいいのではないでしょうか?

    キャンセル

  • 2019/02/20 19: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 //差出人
    }
    );

    }

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る