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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

1回答

2759閲覧

Slackで誕生日を通知してくれるBotが作成したいのですが、エラーが出ます。

alleycat

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

1クリップ

投稿2021/11/01 10:25

https://nmmmk.hatenablog.com/entry/2018/05/05/110811
の記事を参考にSlackで誕生日をお祝いしてくれるbotを作成しようとしています。

スプレッドシートを作成し、画像も用意しました。

以下のコードを貼り付け、そのまま実行ないしはmainをしました。

// スプレッドシートの行列情報
var StartRow = 2; // 開始行
var NameCol = 1; // 名前列
var BirthdayCol = 2; // 誕生日列

//------------------------------
// main処理
//------------------------------
function main() {
// 今日の日付を取得
var nowDate = new Date();

// 今日の曜日を取得
var todayDayOfWeek = nowDate.getDay();

// 土曜、日曜は投稿しない
if (isSatOrSun(todayDayOfWeek) === true) {
return;
}

// 誕生日リストのスプレッドシートを参照
var spreadsheet = SpreadsheetApp.openById('誕生日リストのスプレッドシートのIDを指定しています');

// シートにアクセス
var sheet = spreadsheet.getSheetByName('誕生日');

// データ取得
var data = sheet.getDataRange().getValues();

for (var i = 0; i < data.length; i++) {
if (i < StartRow) {
continue;
}

// 名前を取得 var name = data[i][NameCol]; // 誕生日を取得 var birthday = data[i][BirthdayCol]; // 誕生日を日付でパースし、日付が正しく入力されているかチェック var isDate = !isNaN(Date.parse(birthday)); // 誕生日入力済みであることをチェック if (isDate === true) { // 投稿処理 postProc(name, birthday, nowDate); }

}
}

//------------------------------
// 投稿処理
//------------------------------
function postProc(name, birthday, nowDate)
{
var todayDayOfWeek = nowDate.getDay();
var message = "";

// 金曜日
if (todayDayOfWeek === 5){

// 1日後(土曜日) var dtSat = new Date(); dtSat.setDate(dtSat.getDate() + 1); // 2日後(日曜日) var dtSun = new Date(); dtSun.setDate(dtSun.getDate() + 2); if (isSend(dtSat, birthday) === true) { message = createMessage(name, "明日"); } else if (isSend(dtSun, birthday) === true) { message = createMessage(name, "あさって"); } else if (isSend(nowDate, birthday) === true) { message = createMessage(name, "今日"); }

}
else
{
if (isSend(nowDate, birthday) === true) {
message = createMessage(name, "今日");
}
}

// メッセージが生成されていれば、Slackに投稿
if (message != "") {
// おめでとう画像を取得
var fileId = getRandomImageID();

// Slackへ投稿 postSlack(message, fileId);

}
}

//------------------------------
// 土曜日 or 日曜日判定
//------------------------------
function isSatOrSun(todayDayOfWeek)
{
// 土曜、日曜は投稿しない
if ((todayDayOfWeek === 0) || (todayDayOfWeek === 6)) {
return true;
}

return false;
}

//------------------------------
// 送信有無取得
//------------------------------
function isSend(compareDate, birthdayDate)
{
// 月、日が一致するかをチェックする
if ((compareDate.getMonth() === birthdayDate.getMonth()) &&
(compareDate.getDate() === birthdayDate.getDate()))
{
return true;
}

return false;
}

//------------------------------
// メッセージ作成
//------------------------------
function createMessage(name, dayMessage)
{
var message = dayMessage + 'は, ' + name + 'さんの誕生日です 🎂' + '\r\n' +
'おめでとうございます 🎉 🎉 🎉'

return message;
}

//------------------------------
// 誕生日おめでとう画像のIDを取得
//------------------------------
function getRandomImageID() {
var imageFileArray = [
"1nX1ureCMBocPpySmYtSZ4aTnxTBo-tTm",
"1q0O8otOSrDpeqsDVivR6RQ8oYYnlID4P",
"1l8luJjgSJG7dDngmMiQAjT1gttXZDico",
"113dLQ4eZCzGx-Odrg3KrBCStm5swvzr7",
"1Vu6FvdKED5QV_A-Y_6n95rZtFqjsCPVx",
"1BZ6Tgjb4VZdtYu6yGOqxphYkuVFj9to9",
"1Drno0VWt4HoHzacG4Plcw6geSQd7nl1_",
"14yZE3TeCfF29RhbrPJalqJTeRQvDCb-7",
];

// 0~7の値を取得
var randomValue = Math.floor( Math.random() * 8 );

return imageFileArray[randomValue];
}

//------------------------------
// Slackへ投稿
//------------------------------
function postSlack(text, fileId) {

var payload = {
text: text,
attachments: [
{
color: "#2eb886",
pretext: "",
image_url: "http://drive.google.com/uc?export=download&id=" + fileId,
}
]
};

// Incoming WebhooksのURL
var url = "Incoming Webhooksの設定時に取得した投稿先のチャンネルのURLを設定しています;

var options = {
"method" : "POST",
"headers": {"Content-type": "application/json"},
"payload": JSON.stringify(payload)
};
UrlFetchApp.fetch(url, options);
}

何度やっても

TypeError: Cannot read property 'getDataRange' of null
main @ コード.gs:28

と出てしまいます。
GASやプログラミング自体初めてです。
どの部分が誤っているのかもあまり良く分かっていません。

この方法で初心者がBotを作成するのは難しいのでしょうか?
また、代替案などありましたらご教授いただけると助かります。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

TypeError: Cannot read property 'getDataRange' of null

というのは getDataRange(String) メソッドが生えている sheet オブジェクトが null なのでエラーになっているという意味です。

// シートにアクセス

var sheet = spreadsheet.getSheetByName('誕生日');

// データ取得
var data = sheet.getDataRange().getValues();

sheet が null になっているようなので、そのスプレッドシートに「誕生日」という名前のシートが存在しているかを確認してみるとよいのではないでしょうか?

投稿2021/11/01 10:51

seratch

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alleycat

2021/11/01 11:42

迅速な回答ありがとうございます。 「誕生日」というスプレッドシートからスクリプトエディタにて作成いたしました。 他に考えられる要因は何かありますでしょうか? お手数ですが、お時間がありましたら回答いただけると幸いです。
seratch

2021/11/01 11:45

いや、スプレッドシートの名前ではなく、その中のシートの名前ですよ。下の方にタブのようになったところで名前をつけられるので、そこで「誕生日」というラベルを設定してあげてください。
alleycat

2021/11/01 12:03

分かりやすい解説ありがとうございます。 再び実行したところ、以下の様なエラーが出ました。 TypeError: birthdayDate.getMonth is not a function isSend @ コード.gs:117 postProc @ コード.gs:83 main @ コード.gs:47 考えられる要因はありますか?
seratch

2021/11/01 12:10

このエラーに対する対処の答えをお伝えすること自体は簡単ですが、このまま一つ一つお伝えするのは、ご自身の成長にならないかと思います。 var birthday = data[i][BirthdayCol]; の後に console.log(birthday); を入れてみる(=print デバッグ)など、自分なりのデバッグする方法を見出してみるとよいでしょう(これ、ちゃんとしたヒントです)。
alleycat

2021/11/04 02:04

返信が遅くなり申し訳ありません。 そこまで考えてくださってありがとうございます。 まだまだ初心者なので時間はかかりますが一つずつ学んでいければいいなと思っております。 とりあえずは、スプレッドシートの方で表示形式の詳細設定から[日付]に変更することで 実行でき、Slackに投稿することができました。 ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問