1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Send-to-kindleを使ってたくさんの人へ書籍データを送りたいので、GoogleDrive + Spreadsheet + GoogleAppsScript で実現する

Posted at

やりたいこと

KindleへEmail経由で書籍データを送ると、すぐに読めるようになるSend-to-Kindle。
とても便利だけど、書籍データをたくさんの人にメーラーで手動送信するとなると手間がかかりすぎる。
リストを作って一気に送りたいよね。

アーキテクチャ

現場の非エンジニアでも扱えるように、GSuiteの範囲内で全て用意する。

  • Google Spreadsheet
  • Google Apps Script (GAS)
  • Google Drive

image.png

手順

  1. Spreadsheetを用意する
  2. Google Driveの特定の場所に書籍データを格納する
  3. Spreadsheetからスクリプトを作成し、Send-to-kindleを使って書籍データを送る

1. Spreadsheetを用意する

実行のためのボタンを置いておくシートと、送信先アドレスや書籍データを格納するリスト用のシートを作る。
ここでは、リスト用シート名を"list"としている。(後で使う)
image.png

挿入→図形描画、でボタンを作り、画面に貼り付けた後、右クリック→スクリプトを割り当てで、呼び出す関数名を記入する。
ここでは、"sendBook"としておく。
image.png

2. Google Driveの特定の場所に書籍データを格納する

任意の場所に書籍データ格納用フォルダを作成する。
URLにあるフォルダIDは、後で使うのでメモしておく。

image.png

3. Spreadsheetからスクリプトを作成し、Send-to-kindleを使って書籍データを送る

最終的にはこんなコード。ポイントとなる関数は後述する。

コード.gs
function sendBook() {
  // 実行確認
  if(Browser.msgBox("確認", "ファイルを送りますか?", Browser.Buttons.OK_CANCEL) == "cancel") {
    return;
  }

  // 電子書籍データが格納されているフォルダ
  var folder = DriveApp.getFolderById('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  
  // アドレス、ファイルリスト取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('list');
  const sheetData = sheet.getDataRange().getValues();
  
  // 行ごとに処理
  for (var i = 1; i < sheetData.length; i++) {
    var address = sheetData[i][0];
    var filename = sheetData[i][1];
    var mobi = folder.getFilesByName(filename).next();

    // メールを送信
    GmailApp.sendEmail(address, '', ' ', {attachments: [mobi]}); 
  }

  Browser.msgBox("完了しました");
}

Browser.msgBox()

画面にダイアログを出す関数。ボタンを押すたびにファイルを送ると大変なので、確認したのち実施するようにしておく。

DriveaApp.getFolderById()

Google Driveの書籍データ格納フォルダを指定する。

SpreadsheetApp.getActiveSpreadsheet().getSheetByName()

Spreadsheetの、指定のシート情報を取得する。

sheet.getDataRange().getValues();

行データを配列で取得する。あとでfor文などを使い、1行づつ読み込んで使う。

folder.getFilesByName(filename).next()

先ほどのDriveフォルダから、名前の一致するファイルを取得する。リストで取ってくるので、1件欲しい場合はnext()で絞る。

GmailApp.sendEmail()

今回の主役。
これを呼ぶだけで添付メールを送ることが出来る。

Send-to-kindleを使うときに注意するポイントがある。
本文が空だと「ファイル添付されてない」ってKindleから怒られてしまう。

なので、

GmailApp.sendEmail(address, '', ' ', {attachments: [mobi]});
と、本文にスペース1つでいいので、空にしないでおこう。

実行結果

Kindleのパーソナル・ドキュメントに届いていることを確認する。(数分かかる)
image.png

注意点

このスクリプトから送ると、メール送信者は実行者のアドレスになる。
あらかじめKindleの設定に、実行者のアドレスを登録して許可しておく必要がある。

別のアドレスを設定したい場合、
GmailApp.sendEmail関数でFromアドレスを指定することができるが、自由に設定できるわけではなく、
このマクロ実行者のエイリアスの中からしか選べない。

参考:
sendEmail(recipient, subject, body, options)

the address that the email should be sent from, which must be one of the values returned by getAliases()
(fromに設定するEmailアドレスはgetAliases()が返すもののいずれかでなければならない)

エイリアスに自分のアドレス以外を登録して送りたい場合は、以下記事を参考に。

[Google Apps Script]別のアドレスからメールを送信する。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?