スキルアップを始める!

【GoogleAppsScript】[1/2]スプレッドシートで今日の日付に一致した行番号の内容を毎日メールで自動送信するスクリプト

GAS(GoogleAppsScript)
GAS(GoogleAppsScript)
この記事は約5分で読めます。

※記事中に広告情報を含みます。

スキルを手に入れた時、人は強くなれる。
Youtubeでスキルアップを始める 電子書籍でスキルアップを始める
\ワードプレスのスキルアップはこちら!/ WordPress入門読本

例えば「毎日決まった時間にスプレッドシート上の今日の日付と一致した行番号の内容(今日の名言)をメールで自動送信したい」と思った場合にGAS(GoogleAppsScript)で実現する方法です。

スクリプトエディタを起動する

このあたりは、毎度おなじみのGoogleスプレッドシートを準備してツールから「スクリプトエディタ」を起動します。

スクリプトエディタが立ち上がります。

まずはスプレッドシートのデータ読み込み用変数をセットする

このあたりも毎回ですが、まずはスプレッドシートのデータを読み込むための変数を準備します。※SPREADSHEET_IDのところは、開くスプレッドシートのIDをセットします。

const spreadSheet = SpreadsheetApp.openById("SPREADSHEET_ID");
const activeSheet = spreadSheet.getActiveSheet;
const sheetName = '名言';
const dataSheet = spreadSheet.getSheetByName(sheetName);

それぞれの変数はこのような役割の感じです。※変数名は覚えやすい名前に随時改変ください。

  • spreadSheet … ファイルを読み込む
  • activeSheet … アクティブなシートを読み込む ※無くてもOK
  • sheetName … シート名を直接指定して読み込む
  • dataSheet … データのあるシートを読み込む ※前の変数とまとめてしまってもOK

データ取得用の変数をセットする

このような感じでデータを取得するための変数を準備します。

let dRange = dataSheet.getDataRange();
let lastRow = dataSheet.getLastRow();
let lastCol = dataSheet.getLastColumn();
let today = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
let todayCol;
let getToday;
  • dRange … 表のデータを取得するための変数 ※データのRangeが入る。使わないかもしれない。
  • lastRow … 最終行の番号を知る ※ループ判定用
  • lastCol … 最終列の番号を知る ※使わないかもしれないが列側になった時用
  • today … 今日の日時を取得してyyyy/MM/dd形式に変換する
  • todayCol… 今日の行番号を取得 ※後で使う
  • getToday … 今日の日付を取得する ※後で使う

送信先アドレス 件名 本文用の変数

メール送信用の変数を準備します。

// 送信先アドレス 件名 本文
let toSend = "from.eguchi@gmail.com";
let toSubject;
let toBody;
  • toSend … 送信先のメールアドレス
  • toSubject … メールの件名用 ※固定でもOKですがひとまず空にしておく
  • toBody … メール本文用 ※後で追加する

これで大体の下準備は完了かと思います。グローバル変数にセットしておきます。

function sendMail()

メール送信用の関数をセットします。名前は任意ですが「sendMail」のような感じがシンプルでよいのではと思います。

あとは、下記のような感じでループを作ります。

function sendMail() {

//「今日の行番号」を取得する
for (var i = 1; i <= lastRow; i++ ) {
 getToday = dataSheet.getRange(1,i).getValue();
 getToday = Utilities.formatDate( getToday, 'Asia/Tokyo', 'yyyy/MM/dd');

  if(getToday == today){
   todayCol = i;
   toSubject = dataSheet.getRange(i,2).getValue();
   toBody = dataSheet.getRange(i,3).getValue();
   
    GmailApp.sendEmail(toSend,toSubject,toBody);
  }

何をやっているかというと…

  1. A列(getRange(i,1))が今日の日付(変数:today)と一致した時
  2. その行番号を取得する
  3. B列(getRange(i,2))の値を件名(toSubject)
  4. C列(getRange(i,3))の値を本文にセットする
  5. メール送信する
  6. 最終行まで行ってしまったら終了

みたいな流れです。

エラーが起きた時のために、念のためログもセットしておきます。

console.log("todayCol:"+todayCol);
console.log("getToday:"+getToday);
console.log("lastCol:"+lastCol);
console.log("dRange:"+dRange);
console.log("toSend:"+toSend);
console.log("toSubject:"+toSubject);
console.log("toBody:"+toBody);

スクリプトを実行してみる

ひとまずスクリプトを実行します。いつものように「権限を確認」が表示されるのでGoogleアカウントに権限を与えます。

実行してみます。

Exception: The parameters…

Exception: The parameters (String,String,String) don’t match the method signature for Utilities.formatDate.

エラーが表示されました。

don’t match the method signatureと言われます・・・。どうやら、Utilities.formatDateの中がダメなのかな?という感じです。

中を関数で入れたりしているので、全て日付の状態に変更してみます。

ダメでした。

まとめ

ここまでのところで、エラーが表示されてしまいスクリプトの実行が止まってしまいましたが、ここからうまく実行できるように修正を進めていきます。

この続きについてはPART2の記事に書いていますので、ご参考ください😃

URLをコピーしました!