2018年11月16日金曜日

Googleスプレッドシートでメールの一斉送信をする

一斉にメールを送信したいとき、スプレッドシートとApp Scriptを使うと簡単に実現できます。

【使うもの】
・スプレッドシート
・App Script
・Gmail

【手順】

1.以下のようなスプレッドシートを作成します。



2.スクリプトエディタを開きます。



3.以下のようにスクリプトを書きます。


function sendmail() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getDataRange();
  var lastRow = range.getLastRow();
  var list = range.getValues();
  var subject = "一斉送信テスト"
  var body = "送信テストです。"
  for(var i=1; i<lastRow; i++){
    var mail_list = list[i][1];
    MailApp.sendEmail(mail_list, subject, body);
    sheet.getRange(i+1, 3).setValue('送信完了');
  }
}

4.スプレッドシートにこのスクリプトをマクロとして登録します。




「関数を追加」をクリックします。



チェックアイコンが表示されると完了です。



5.使ってみる



「ツール」>「マクロ」の中に作成したスクリプトファイル名「sendmail」が追加されています。これをクリックすると、実際にメール送信を開始します。



送信が完了すると「ステータス」列に「送信完了」が追記されます。

以上、スプレッドシートで簡単にメールを一斉送信する方法をご紹介しました。

但し、この方法にも上限があります。

  • 送信1500通/24時間
  • 一回のスクリプトの実行時間6分
これは、1500通以上の送信、または一度で6分を超える実行はできないということです。
例えば、1通あたりのメール送信処理時間を0.4秒(今回の方法)とすると以下の見積りになります。

6分 → 360秒
360 ÷ 0.4 = 900(通)

本文が長く添付ファイルありのメールを送信するとなると、1通あたりの送信処理時間も長くなり、一度に送信するメール数も少なくなります。

と言っても、スクリプトの実行自体は送信上限に到達していない限り、何回でも実行できますので、上手に活用すれば良いと思います。


上限に関しての詳細はこちら
https://developers.google.com/apps-script/guides/services/quotas

2018年10月29日月曜日

アドオンでGmailをカスタマイズする

Gmail アドオンを活用すれば Gmail のサイドバーをカスタマイズして、自社に必要な機能を追加することができます。また、その機能はAndroidOSのGmailアプリからも利用することができるので、機能によっては業務効率が大きく向上することも期待できます。現在、iOSのGmail アプリはまだ対応していないそうなので、しばらく待ちましょう。

今回は、公式サイトのクイックスタートを試してみます。
このアドオンサンプルは、「任意のメールを選択した際、そのメールの送信者に関連するメールを最新5件表示する」という機能です。

G Suiteの使用者は、実際に作成して試してみてください。以下公式のサンプルを日本語で転記します。

クイックスタート:Gmailアドオン https://developers.google.com/gmail/add-ons/guides/quickstart

必要なもの

  1. Gmailが有効なGoogleアカウント
  2. Googleドライブへのアクセスができること

ステップ1 スクリプトを作成する

  1. 新規にApps Script projectを作成します。
  2. 空のプロジェクトを選択します。
  3. 「コード.gs」を下記のように記述します。
  4. var MAX_THREADS = 5;
    
    /**
     * Returns the array of cards that should be rendered for the current
     * e-mail thread. The name of this function is specified in the
     * manifest 'onTriggerFunction' field, indicating that this function
     * runs every time the add-on is started.
     *
     * @param {Object} e data provided by the Gmail UI.
     * @return {Card[]}
     */
    function buildAddOn(e) {
      // Activate temporary Gmail add-on scopes.
      var accessToken = e.messageMetadata.accessToken;
      GmailApp.setCurrentMessageAccessToken(accessToken);
    
      var messageId = e.messageMetadata.messageId;
      var senderData = extractSenderData(messageId);
      var cards = [];
    
      // Build a card for each recent thread from this email's sender.
      if (senderData.recents.length > 0) {
        senderData.recents.forEach(function(threadData) {
          cards.push(buildRecentThreadCard(senderData.email, threadData));
        });
      } else {
        // Present a blank card if there are no recent threads from
        // this sender.
        cards.push(CardService.newCardBuilder()
          .setHeader(CardService.newCardHeader()
            .setTitle('No recent threads from this sender')).build());
      }
      return cards;
    }
    
    /**
     *  This function builds a set of data about this sender's presence in your
     *  inbox.
     *
     *  @param {String} messageId The message ID of the open message.
     *  @return {Object} a collection of sender information to display in cards.
     */
    function extractSenderData(messageId) {
      // Use the Gmail service to access information about this message.
      var mail = GmailApp.getMessageById(messageId);
      var threadId = mail.getThread().getId();
      var senderEmail = extractEmailAddress(mail.getFrom());
    
      var recentThreads = GmailApp.search('from:' + senderEmail);
      var recents = [];
    
      // Retrieve information about up to 5 recent threads from the same sender.
      recentThreads.slice(0, MAX_THREADS).forEach(function(thread) {
        if (thread.getId() != threadId && ! thread.isInChats()) {
          recents.push({
            'subject': thread.getFirstMessageSubject(),
            'count': thread.getMessageCount(),
            'link': 'https://mail.google.com/mail/u/0/#inbox/' + thread.getId(),
            'lastDate': thread.getLastMessageDate().toDateString()
          });
        }
      });
    
      var senderData = {
        email: senderEmail,
        recents: recents
      };
    
      return senderData;
    }
    
    /**
     *  Given the result of GmailMessage.getFrom(), extract only the email address.
     *  getFrom() can return just the email address or a string in the form
     *  "Name ".
     *
     *  @param {String} sender The results returned from getFrom().
     *  @return {String} Only the email address.
     */
    function extractEmailAddress(sender) {
      var regex = /\<([^\@]+\@[^\>]+)\>/;
      var email = sender; // Default to using the whole string.
      var match = regex.exec(sender);
      if (match) {
        email = match[1];
      }
      return email;
    }
    
    /**
     *  Builds a card to display information about a recent thread from this sender.
     *
     *  @param {String} senderEmail The sender email.
     *  @param {Object} threadData Infomation about the thread to display.
     *  @return {Card} a card that displays thread information.
     */
    function buildRecentThreadCard(senderEmail, threadData) {
      var card = CardService.newCardBuilder();
      card.setHeader(CardService.newCardHeader().setTitle(threadData.subject));
      var section = CardService.newCardSection()
        .setHeader('Recent thread');
      section.addWidget(CardService.newTextParagraph().setText(threadData.subject));
      section.addWidget(CardService.newKeyValue()
        .setTopLabel('Sender')
        .setContent(senderEmail));
      section.addWidget(CardService.newKeyValue()
        .setTopLabel('Number of messages')
        .setContent(threadData.count.toString()));
      section.addWidget(CardService.newKeyValue()
        .setTopLabel('Last updated')
        .setContent(threadData.lastDate.toString()));
    
      var threadLink = CardService.newOpenLink()
        .setUrl(threadData.link)
        .setOpenAs(CardService.OpenAs.FULL_SIZE);
      var button = CardService.newTextButton()
        .setText('Open Thread')
        .setOpenLink(threadLink);
      section.addWidget(CardService.newButtonSet().addButton(button));
    
      card.addSection(section);
      return card.build();
    }
  5. ファイル > 保存クリックして、プロジェクト名を「Quickstart」にしてOKを押す。

ステップ2 マニフェストファイルを更新する

  1. スクリプトエディタの「表示」>「マニフェストファイルを表示」>「appsscript.json」を選択
  2. 中身を下記の記述に置き換える
  3. {
      "oauthScopes": [
        "https://www.googleapis.com/auth/gmail.addons.execute",
        "https://www.googleapis.com/auth/gmail.readonly"
      ],
      "gmail": {
        "name": "Gmail Add-on Quickstart",
        "logoUrl": "https://www.gstatic.com/images/icons/material/system/2x/bookmark_black_24dp.png",
        "contextualTriggers": [{
          "unconditional": {
          },
          "onTriggerFunction": "buildAddOn"
        }],
        "openLinkUrlPrefixes": [
          "https://mail.google.com/"
        ],
        "primaryColor": "#4285F4",
        "secondaryColor": "#4285F4"
      }
    }
    
  4. 「ファイル」>「保存」をクリックする

ステップ3 アドオンをデプロイする

  1. スクリプトエディタの「公開」>「マニフェストから配置」を選択する
  2. Deploymentsダイアログの「Get ID」をクリックして、Deployment IDをコピーする

  3. ダイアログを閉じて、Gmailアドオン設定タブを開きます。
  4. 「ご利用のアカウントで、デベロッパアドオンを有効にします」にチェックする。
  5. コピーしたDeployment IDを貼り付けて、「インストール」をクリックする。

  6. 以下のようになっていればインストール完了です。

ステップ4 アドオンを使ってみる

  1.  Gmailを開くか、すでに開いていればページをリフレッシュします。
  2. 任意のメールを選択して、アドオンを開きます。

  3. 「アクセスを承認」をクリックして該当アカウントを選択して、「許可」します。

以上でアドオンの作成と反映は完了です。

2018年7月13日金曜日

ボットで当月の収支確認(デモ)

ビジネス向けG Suite には Hangouts Chat(ハングアウト チャット)というチャットサービスがあります。1対1、またはチームメンバーに向けてメッセージの交換をすることができるサービスです。

Hangouts Chat
https://gsuite.google.com/products/chat/

このサービスの中に「bot(ボット)」という機能があります。この機能を使って、簡単な「資金繰り表」と「予定作成」を試してみました。

■ 設定概要


  1. Google Cloud Platform で Hangouts Chat APIを有効にする
  2. Google Apps Script でbotのスクリプトを作成する
  3. 「資金繰り表」スプレッドシートを作成する

 

■ 仕上がり

「今月の状況は?」というメッセージに対して、bot(名前:資金繰りアシスタント)は2パターンの返答をします。

【1】当月収支がプラスの場合
 

【2】当月収支がマイナスの場合
 

当月収支がマイナスの場合のとき、「銀行に行く予定を作成する」という提案メッセージが付いてきます。これをクリックすると、botがカレンダーで予定を作成してくれます。
 

     

予定の作成が終わると、「本日、銀行に行く予定を作成しました。」という報告メッセージを返してくれます。
 
以上、シンプルなbotを作成してみました。

今回のbotはスプレッドシートとカレンダーを連携させました。その他にもGmailと連携してメール送信することも可能です。アイデア次第で、より利便性が高まります。

これ以降は、このデモを試案として、皆様の生産性の向上における検討材料になれば幸いです。

2018年6月9日土曜日

App Maker がG Suiteのその他のサービスとしてリリース

2018年6月14日に、G Suite ビジネス、G Suite エンタープライズ向けに、独自のウェブアプリケーションが作成できる「App Maker」が、その他のサービスとしてリリースされるそうです。

App Makerは、Gmail、カレンダー、ドライブなど他のGoogleサービスと簡単に連携でき、社内申請アプリや在庫管理アプリなど、自分がイメージするアプリケーションをドラッグ&ドロップで簡単に作成することができます。

G Suite ベーシックを導入の皆様は、この機会にビジネスかエンタープライズへアップグレードをご検討されてはいかがでしょうか。

App Makerの紹介(英語)


App Maker の活用事例が紹介(日本語)

2018年6月8日金曜日

独自ドメインでブログを簡単にはじめる

会社のブログにBloggerを使う

GoogleのサービスにBlogger(ブロガー)という簡単に情報を投稿できるブログサービスがあります。(この記事を投稿しているこのサイトのことです。)

このBloggerには、独自ドメインを関連付けて使用することができるので、自分のブログ記事の質が高ければ、Googleからのドメインに対する評価が上がり、検索で有利に働くことが期待できます。

会社でG Suiteを導入していれば、すでにGoogleアカウントを持っているので、ブログを簡単に始めることができます。

Bloggerで独自ドメインの設定方法

1.「Blogger」を開く→「設定」→「基本」→「公開」

2.「ブログのアドレス」に「<任意の名称(blogなど)@ 独自ドメイン>」を追加します。HTTPSを使用したいときは、「はい」を選択します。





























3.一度ページをリロードして、追加したアドレスの右横にある「編集」をクリックするとCNAMEの設定情報が参照できます。


4.このCNAMEをDNSサービスで設定して完了です。