2
0

スマホで簡易的に実績を知りたい~GASで毎朝メール通知するようにした~

Last updated at Posted at 2024-07-24

こんにちはTOMです。
前回は下記の記事を書きました。

こちらのスプレッドシートの情報を使って、
・朝礼時の報告を想定して毎朝9時にメールを送るようにする
・数値分析をしてグラフ化する
上記をGASで出来るようにしました。

1. 使用ツール

●Make
●LINEBot
●Googleスプレッドシート
●Googleフォーム
NEW ●Googleスプレッドシート(GAS)

2. やりたかったこと

前回は知りたい場面でLINEを打つと件数が把握できる仕組みを作成しましたが、今回は報告するタイミングが分かっているときはLINE打つまでもなく実績を知りたいシチュエーションを想定して、自動的にメールを送るようにしました。

3. 朝礼時の報告を想定して毎朝9時にメールを送るようにする

今回については、GASを使えば何となく出来るなーとわかってはいたものの、コードなんて自分では書けないのでChatGPTを用いて対応しました。


コードをコピーしてGASに貼り付けすればいいので、とても簡単です。

あれ?エラーが出てしまいました。 メールの容量制限がエラーの元のようです。

恐らくですが、ARRAYFORMULA関数が入っていることでデータが入ってる判定になっていたようです。


無事に実行完了できました。 メールも届きました。

あとは、トリガー設定をして毎朝9時に届くように設定完了です。

4. 数値分析をしてグラフ化する

ChatGPTでスクリプト作成すれば数値分析も簡単にできそうなので、手始めに下記を追加してみます



無事最大獲得件数が表示されました。

次にグラフ作成してメールで送るようにします。

添付されました。

添付内容

件数獲得推移.png


最終的なスクリプトはこちらとなりました。
メール配信
function sendSheetDataAsEmail() {
  // スプレッドシートとシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BOT反映シート');
  
  // データ範囲を取得(B2からB32まで)
  const dataRange = sheet.getRange(2, 2, 31, 3); // 2行目から32行目までの範囲を指定
  const data = dataRange.getValues();
  
  // メールのタイトルと宛先を取得
  const emailSubject = sheet.getRange('F2').getValue();
  const emailRecipient = sheet.getRange('G2').getValue();
  
  // メール本文を構築
  let emailBody = '以下の情報をご確認ください:\n\n';

  // 最大件数を持つ月日を特定するための変数
  let maxCount = 0;
  let maxDate = '';
  
  data.forEach(row => {
    const date = row[0];
    const totalCount = row[1];
    const tenantCount = row[2];
    
    // メール本文の構築
    emailBody += `月日: ${date}, 獲得件数: ${totalCount}, テナント紹介: ${tenantCount}\n`;
    
    // 最大件数を持つ月日の判定
    if (totalCount > maxCount) {
      maxCount = totalCount;
      maxDate = date;
    }
  });
  
  // 最大件数を持つ月日の情報をメール本文に追加
  emailBody += `\n\n最大件数を記録した月日: ${maxDate}(件数: ${maxCount})\n\n`;

  // グラフを作成
  const chart = createChart(sheet);

  // グラフを画像としてエクスポート
  const chartBlob = chart.getAs('image/png');
  const attachment = {
    fileName: '件数獲得推移.png',
    mimeType: 'image/png',
    content: chartBlob.getBytes()
  };
  
  // メール送信
  MailApp.sendEmail({
    to: emailRecipient,
    subject: emailSubject,
    body: emailBody,
    attachments: [attachment]
  });
}

// グラフを作成する関数
function createChart(sheet) {
  // データ範囲を設定
  const chartRange = sheet.getRange('B1:D32');
  
  // チャートオプションを設定
  const chart = sheet.newChart()
    .setChartType(Charts.ChartType.LINE)
    .addRange(chartRange)
    .setPosition(5, 5, 0, 0)
    .build();
  
  // チャートをシートに追加
  sheet.insertChart(chart);
  
  // グラフを画像としてエクスポート
  return chart;
}

5. ChatGPTを使ってみて

今回ChatGPTを使ってみて、一からGASを自分で書かかずに済みました。
個人的に一番恩恵を感じたのは、修正や試行錯誤などの時間を多く取れたことでした。
アイデア出しや翻訳などではお試し程度で、ChatGPTを使用したことはありました。
しかし、GASのようなコードに今回初めて使ったことで、ある程度やりたいことが決まっているときやゴールが想像できているときに、真価を発揮するのではないかなぁと感じました。
(あくまで個人的な意見ですが・・・)
これからも有用な使い方を見つけて、ChatGPTを使っていきたいと思います!

6. 最後に~実は失敗してます~

本当はLINE公式アカウントから配信できるようにしたかったです。

LINE配信(失敗)
function getSheetData() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "BOT配信シート";
  var sheet = spreadsheet.getSheetByName(sheetName);
  
  if (sheet === null) {
    throw new Error("シート名 '" + sheetName + "' が見つかりません。シート名を確認してください。");
  }
  
  // B列, C列, D列のデータを取得
  var dataRange = sheet.getRange("B2:D" + sheet.getLastRow());
  var data = dataRange.getValues();
  
  return data;
}

function sendLineBroadcastMessage(message) {
  var token = "YOUR_LINE_ACCESS_TOKEN";  // ここにあなたのLINEアクセストークンを入力してください
  
  // messageの内容を確認
  Logger.log("Message: " + message);
  
  var url = "https://api.line.me/v2/bot/message/broadcast";
  var payload = {
    messages: [{
      type: "text",
      text: message
    }]
  };
  
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json; charset=UTF-8",
      "Authorization": "Bearer " + token
    },
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };
  
  var response = UrlFetchApp.fetch(url, options);
  var responseCode = response.getResponseCode();
  var responseBody = response.getContentText();
  
  if (responseCode !== 200) {
    throw new Error("Request failed for " + url + " returned code " + responseCode + ". Response: " + responseBody);
  }
}

function sendSheetDataToLine() {
  try {
    var data = getSheetData();
    var message = "BOT配信シートのデータ:\n";
    
    data.forEach(function(row) {
      var date = row[0];
      var total = row[1];
      var tenant = row[2];
      message += "月日: " + date + ", 獲得件数: " + total + ", テナント紹介: " + tenant + "\n";
    });
    
    // メッセージが空でないかを確認し、空の場合はデフォルトのメッセージを設定
    if (message.trim() === "BOT配信シートのデータ:\n") {
      message = "データです";
    }
    
    sendLineBroadcastMessage(message);
  } catch (e) {
    Logger.log(e.toString());
    sendLineBroadcastMessage("エラーが発生しました: " + e.message);
  }
}


上記までは行き着いたが、「送信するメッセージが空の文字列または未定義になっている」というエラーが解消できずに一旦断念しました。くやしい。。

ただ、実務的な部分を考えるとメール配信の方が良いのだが、せっかくの機会なので知識付けてリベンジしたいと思います!

2
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
2
0