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

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

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

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

Google Apps Script

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

Q&A

1回答

680閲覧

GASを用いたスプシとDiscordのリマインダーに関して

SatouSio

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

1グッド

1クリップ

投稿2023/08/31 06:21

実現したいこと

  1. スプシを参照し、期日の近いタスクをDiscordの特定テキストチャンネルへ通知する
  2. G列のチェックボックスがチェック済みの行は通知対象外とする

前提

  • 見よう見まねで書いたコードは以下となります。
  • 情報元となるスプシのサンプル画像とDiscord側での出力結果も貼り付けております。
  • 【スプシ】イメージ説明
  • 【Discord出力結果】イメージ説明

発生している問題・エラーメッセージ

【実行ログ】 TypeError: Cannot read properties of undefined (reading '7') DiscordSend @ コード.gs:20 【Discord上】 スプシG列の完了フラグ(チェックボックス)がチェック済みでもDiscord上に通知されてしまう。

該当のソースコード

JavaScript

1function DiscordSend() { 2 var mySs = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得 3 var Sheet = mySs.getSheetByName('タスク一覧'); // シート名を取得 4 var today = new Date(); //今日の日付を取得 5 6 /* 255行目までループ */ 7 for (var i = 1; i <= 255; i++) { 8 var category = Sheet.getRange(i, 1).getValue(); //A列 「カテゴリー」を取得 9 var to_do = Sheet.getRange(i, 3).getValue(); //C列 「作業内容」を取得 10 var detail = Sheet.getRange(i, 4).getValue(); //D列 「詳細」を取得 11 var limit = Sheet.getRange(i, 6).getValue(); //F列「期限」を取得 12 var status = Sheet.getRange(i, 9).getValue(); //I列「担当」を取得 13 var importance = Sheet.getRange(i, 10).getValue(); //J列「memo」を取得 14 var date_limit = new Date(limit); //F列「期限」のDateを作成 15 var dt = date_limit.getTime() - today.getTime(); //date_limitから今日の日付を引く 16 var day = Math.ceil(dt / 1000 / 60 / 60 / 24); //日付に変換 17 18 /* G列完了フラグ(チェックボックス)の有無判定 */ 19 var value = Sheet.getDataRange().getValues(); 20 if( value [i] [7] === true ) { 21 checkvalue = checkvalue + values[i][1]; 22 } 23 24 else if (0 <= day && day <= 2) { //締め切り当日~2日前を抽出 25 var strBody1 = "カテゴリー:" + category + "\n" 26 + to_do + "の作業に取り掛かりましょう。\n" /* 改行 */ 27 + "期限まであと" + day + "日です!。\n" /* 改行 */ 28 + "【詳細】\n" /* 改行 */ 29 + detail + "\n" /* 改行 */ 30 +"期限:" + date_limit + "\n"; 31 + "\n" /* 改行 */ 32 33 const WEBHOOK_URL = 'https://discord.com/api/webhooks/xxxx; // ★★★DiscordのWebhook URL 34 35 const payload = { 36 'username': 'リマインダー', 37 'content': strBody1, 38 'tts': false, 39 } 40 41 const param = { 42 'method': 'POST', 43 'headers': { 44 'Content-type': 'application/json' 45 }, 46 'payload': JSON.stringify(payload) 47 } 48 49 UrlFetchApp.fetch(WEBHOOK_URL, param); 50 } 51 } 52}

試したこと

GASを扱っているサイトの確認

takanaweb5👍を押しています

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

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

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

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

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

guest

回答1

0

Discordは使っていないので、送信結果は確認できておりません。
繰り返し処理の対象を配列にしてみました。
日付の表示書式を設定してあります。

それから、疑問点があります。
日付の表示が月/日となっていて年がないのですが、
ここの入力を手入力で月/日と年を省略すると
年内に翌年の1月以降の日付(1/10)を入れたつもりでも今年の1月になります。

JavaScript

1function sendDiscordNotice() { 2 var mySs = SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを取得 3 var Sheet = mySs.getSheetByName('タスク一覧');//シート名を取得 4 var today = new Date();//今日の日付を取得 5 var values = Sheet.getDataRange().getValues();//セルの値を配列に取得 6 var strBody1 = '';//送信メッセージ 7 for (var i = 0; i < values.length; i++) { 8 //G列完了フラグがtrueなら処理対象外 9 if (values[i][7 - 1] === true) { 10 // checkvalue = checkvalue + values[i][1];//← このコードの意味不明(削除可) 11 continue; 12 } 13 var limit = values[i][6 - 1];//F列「期限」を取得 14 var date_limit = new Date(limit);//F列「期限」のDateを作成 15 var dt = date_limit.getTime() - today.getTime();//date_limitから今日の日付を引く 16 var day = Math.ceil(dt / 1000 / 60 / 60 / 24);//日付に変換 17 //締め切り当日~2日前が処理対象 18 if (0 <= day && day <= 2) { 19 var category = values[i][1 - 1];//A列 「カテゴリー」を取得 20 var to_do = values[i][3 - 1];//C列 「作業内容」を取得 21 var detail = values[i][4 - 1];//D列 「詳細」を取得 22 // var status = values[i][9 - 1];//I列「担当」を取得(未使用) 23 // var importance = values[i][10 - 1];//J列「memo」を取得(未使用) 24 strBody1 += "カテゴリー:" + category + "\n" 25 + to_do + "の作業に取り掛かりましょう。\n" 26 + "期限まであと" + day + "日です!。\n" 27 + "【詳細】\n" 28 + detail + "\n" 29 + "期限:" + Utilities.formatDate(date_limit, 'JST', 'yyyy/M/d') 30 + "\n\n";//改行+改行 31 } 32 } 33 const WEBHOOK_URL = 'https://discord.com/api/webhooks/xxxx'; // ★★★DiscordのWebhook URL 34 const payload = { 35 'username': 'リマインダー', 36 'content': strBody1, 37 'tts': false, 38 } 39 const param = { 40 'method': 'POST', 41 'headers': { 42 'Content-type': 'application/json' 43 }, 44 'payload': JSON.stringify(payload) 45 } 46 if (strBody1) { 47 // console.log(param.payload); 48 UrlFetchApp.fetch(WEBHOOK_URL, param); 49 } 50}

投稿2023/08/31 12:29

編集2023/08/31 23:59
YellowGreen

総合スコア861

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問