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

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

新規登録して質問してみよう
ただいま回答率
86.12%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

解決済

スプレッドシートのシフトを元に、開催2時間前に「オンライン連絡対象」フラグのあるシフトに対するアラートをslackに送信したい

hinahinahinaaaa
hinahinahinaaaa

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1回答

0グッド

0クリップ

291閲覧

投稿2022/10/31 07:50

編集2022/10/31 08:40

前提

スプレッドシートにて、「オンライン連絡対象」と記載されている場合のみ、
slackにシフトの連絡をする、というプログラムを作成中です。

発生している問題

こちらのサイトを確認しながら

if (formatClosingDay === remindDate && status !== '完了') の部分を if (status === 'オンライン連絡対象') このように書き換えたのですが、 「オンライン連絡対象」だけではなく、すべてのシフトが通知されてしまう状態です。 「オンライン連絡対象」と記載されている場合のみ、slackにシフトの連絡が届くように修正したいです。

該当のソースコード

function taskRemind_2() { // シート取得 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('shift_import'); // ループ数定義 const firstRow = 2; const lastRow = sheet.getLastRow(); // アラート対象日フォーマット const date = new Date(); for(var i = firstRow; i <= lastRow; i++) { // ↑2行目〜最後の記載がある行を取得してる_↓下からは各項目取得 var title = sheet.getRange('G' + i).getValue();//セッション名の取得 var contactPerson = sheet.getRange('K' + i).getValue();//担当者の取得 var startingDay = sheet.getRange('B' + i).getValue();//開始時刻の取得 var formatClosingDay = Utilities.formatDate(startingDay, 'JST', 'MM/dd HH:mm~'); var status = sheet.getRange('M' + i).getValue();//リマインド対象かのジャッジ // リマインド時 if (status === 'オンライン連絡対象') { var postUrl = '--Slack Webhook URL--'; var message = `【リマインダー】開催まであと2時間です!\n■セッション名:${title}\n■担当者:${contactPerson}\n■開催日時:${formatClosingDay}` var payload = JSON.stringify({ "text" : message }) var options = { method: 'post', contentType: 'application/json', payload: payload } UrlFetchApp.fetch(postUrl, options); } } }

補足情報(FW/ツールのバージョンなど)

読み込み先のスプレッドシートの列構成は以下の通りです。

ABCEDFGHIJKLMNO
連番開催日時終了日時ユーザーIDセッションID開催拠点セッション名セッションキー公開状態申し込み人数ユーザー名役割名運営連絡送信シフト確認OK?アラート発動!

飛んで以下セルには関数が入っています

  • R1:=now()
  • R2:=$R$1+time(1,0,0)
  • R3:=$R$1+time(2,0,0)
  • R4:=$R$1+time(3,0,0)
  • M2:=if(and(B2>$R$1,$R$3>B2,F2="オンライン"),"オンライン連絡対象",if(and(B2>$R$1,$R$4>B2,REGEXMATCH(F2,"拠点")),"拠点連絡対象","連絡対象外"))

イメージ説明

↑こちらを投稿後、以下の編集をしてみて無事にslackに通知が飛ぶようになったのですが、
このようなエラーが出てしまっている状態です。
どのように修正すればエラー解消できるでしょうか・・

Exception: The parameters (String,String,String) don't match the method signature for >Utilities.formatDate.
taskRemind_3 @ コード2.gs:64

function taskRemind_3() { // シート取得 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('shift_import'); // ループ数定義 let firstRow = 2 let lastRow = sheet.getLastRow() // アラート対象日フォーマット let date = new Date() for(let i = firstRow; i <= lastRow; i++) { // 各項目取得,一旦うまくいった構文残しておくね let title = sheet.getRange('G' + i).getValue() let contactPerson = sheet.getRange('K' + i).getValue() let closingDay = sheet.getRange('B' + i).getValue() let formatClosingDay = Utilities.formatDate(closingDay, 'JST', 'yyyy/MM/dd HH:mm~') let status = sheet.getRange('M' + i).getValue() // リマインド時 if (status !== '連絡対象外') { let postUrl = 'https://hooks.slack.com/services/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' let message = `【リマインダー】今日が納期です!\n■依頼タイトル:${title}\n■担当者:${contactPerson}\n■納期:${formatClosingDay}` let payload = JSON.stringify({ "text" : message }) let options = { method: 'post', contentType: 'application/json', payload: payload } UrlFetchApp.fetch(postUrl, options) } } }

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

Cocode

2022/10/31 09:18 編集

差し支えありませんでしたら、スプレッドシートのスクショをご提示いただくことは可能でしょうか? どこから、どういった種類の値を取得しているのかよくわからなくて>< よろしくお願いいたしますー! 特に、B列の開催日時をformatDateするときにエラーが起こっていると思うのですが、B列にはどんな値がはいっていますかー?

回答1

0

ベストアンサー

エラーの原因

.formatDate()の引数に渡す値の型が間違っているようです。

javascript

1Utilities.formatDate(date, timeZone, format)

(公式ドキュメントのスクショ)

イメージ説明

現在質問者様のコードではエラーによるとUtilities.formatDate(string, string, string)と、第一引数が間違っているので、エラーになっています。
第一引数にはdate型の値ではなければなりません。
B列の「開催日時」はただの文字列ではないでしょうか?

対策例

Googleスプレッドシートで日時を入力する際は、きちんとdate型で入力するようにしましょう。

私の言語設定が英語なので日本語のデフォルトは分かりませんが、英語の場合11/1/2022 13:00:00と入力すれば、date型と認識されます。
(もしかしたら日本語版は2022/11/1 13:00:00かもしれません)

もし必要であれば、これの表示を日本語の年月日などに変更する方法は公式ドキュメントに紹介されています。

スプレッドシートにカスタムの日付形式や時刻形式を適用するには:

  1. パソコンの Google スプレッドシートで、スプレッドシートを開きます。
  2. 表示形式を設定するデータを選択します。
  3. [表示形式] 次の操作 [数字] をクリックします。
  4. [カスタム日時] をクリックします。
  5. メニューのテキスト ボックスで表示形式を検索して選択します。テキスト ボックスに、カスタムの日付形式や時刻> > 形式を追加することもできます。
  6. [適用] をクリックします。

デフォルトで検索結果に表示される時刻と日付の項目は、スプレッドシートの言語や地域により異なります。
表示形式に時間や分など、時刻や日付の詳細な値を追加する場合は、テキスト ボックスの右側にある下向き矢印をクリックして追加する値を選択します。これらの値の表示形式を変更するには、値の矢印をクリックして項目を選択します。表示形式から値を削除するには、値をクリックして [削除] を選択します。

これを設定しておくと、2022/11/1 13:00と入力しても、自動でそれがdateとして認識され、さらに表示形式は2022年11月1日 13:00など任意の形式で表示することができます。

これでformatDate()の第一引数にいれられるdate型になりましたので、エラーをはくことなく日付の表示形式の変換ができるのではないでしょうか。
スプレッドシートの設定のみでできてしまうので、今回のケースの場合GASで変換する意味がもしかしたらなくなるかもしれませんね。

コード例

イメージ説明

javascript

1function sample1() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 4 // B2 = date型の「11/1/2022 13:00:00」 5 const dateDay = sheet.getRange('B2').getValue(); 6 const formatedDateDay = Utilities.formatDate(dateDay, 'JST', 'yyyy/MM/dd HH:mm~'); 7 console.log(formatedDateDay); // 2022/11/01 13:00~ 8 9 // B3 = date型のカスタム日時「2022年11月1日 13:00」 10 const customDay = sheet.getRange('B3').getValue(); 11 const formatedCustomDay = Utilities.formatDate(customDay, 'JST', 'yyyy/MM/dd HH:mm~'); 12 console.log(formatedCustomDay); // 2022/11/01 13:00~ 13 14 // B4 = ただの文字列の「2022年11月1日 13:00」 15 const stringDay = sheet.getRange('B4').getValue(); 16 const formatedStringDay = Utilities.formatDate(stringDay, 'JST', 'yyyy/MM/dd HH:mm~'); 17 console.log(formatedStringDay); // エラー 18}

投稿2022/10/31 10:36

編集2022/10/31 10:39
Cocode

総合スコア2109

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。