🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

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

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

Q&A

解決済

2回答

3596閲覧

複数のGoogleカレンダーの予定をスプレッドシートに読込したい

KPS

総合スコア8

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

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

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

0グッド

0クリップ

投稿2019/11/13 05:55

編集2019/11/15 04:58

複数のGoogleカレンダーの予定をスプレッドシートに読込したいのですが、gasが作動せず初心者な者でよくわからないので教えて頂きたいです。

最終的にやりたい事は
毎月の予定を自動更新
就業時間が月178時間を超えたらグループラインに通知です。

よろしくお願いいたします。
エラーが出ているのは一番上の所です。
その月の1日からカレンダーを取得して次の月に入った時はクリアーにしたいのです。

var date = DATE(YEAR(TODAY()),MONTH(TODAY()),1); var sheet = SpreadsheetApp.getActiveSpreadsheet(); var calendarId = sheet.setActiveSheet(sheet.getSheetByName("Calendar_ID")); var calendarItem = sheet.setActiveSheet(sheet.getSheetByName("Calendar_Item")); function getId(){ calendarItem.clear(); calendarItem.getRange('A'+(1)).setValue('カレンダーID'); calendarItem.getRange('B'+(1)).setValue('タイトル'); calendarItem.getRange('C'+(1)).setValue('開始時刻'); calendarItem.getRange('D'+(1)).setValue('終了時刻'); calendarItem.getRange('E'+(1)).setValue('所要時間'); var lastR1 = calendarId.getLastRow(); Logger.log("【lastR】:" + lastR1); for (var i = 1; i < lastR1 ; i++){ var lastR2 = calendarItem.getLastRow(); Logger.log("【lastR】:" + lastR2); var calId = calendarId.getRange('A'+(i+1)).getValue(); Logger.log('【calId】' + calId); getCal(calId,lastR2); } } function getCal(id,lastR) { Logger.log('【id】' + id); Logger.log('【lastR】' + lastR); var calendar = CalendarApp.getCalendarById(id); var from= new Date(date);  var end = new Date(date); end.setMonth(end.getMonth()+1); var events = calendar.getEvents(from, end); for (var i = 0; i < events.length; i++) { Logger.log('events要素' + i + '目'); var title = events[i].getTitle(); var startTime = events[i].getStartTime(); var endTime = events[i].getEndTime(); var duration = (endTime - startTime) /(1000*60)/(60); var detail = events[i].getDescription(); var location = events[i].getLocation(); calendarItem.getRange('A'+(lastR+1)).setValue(id); calendarItem.getRange('B'+(lastR+1)).setValue(title); calendarItem.getRange('C'+(lastR+1)).setValue(startTime).setNumberFormat('yyyy/mm/dd hh:mm'); calendarItem.getRange('D'+(lastR+1)).setValue(endTime).setNumberFormat('yyyy/mm/dd hh:mm'); calendarItem.getRange('E'+(lastR+1)).setValue(duration); //calendarItem.getRange('E'+(lastR+1)).setValue(detail); calendarItem.getRange('G'+(lastR+1)).setValue(location); lastR = lastR + 1; } }

上記のは完成いたしました。
ありがとうございます。
178時間を超えたらラインする(超えない場合は作動しない)というGASがラインは送信してるのすが、コードがうまくいきません。
よろしくお願いいたします。スプレッドシート内は
名前 時間
①   0
②   0
③   0
④   0 
⑤   0
と記入されてるシートしか使っておりません。

var today = new Date(); var date = new Date(today.getFullYear(), today.getMonth(), 1); function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = SpreadsheetApp.openById("スプレッドシートID"); var sheet = Spreadsheet.getSheetByName("就業") var range = sheet.getRange("A2:B8"); Logger.log(range.getValues()); } // LINE notifyへの通知 function sendHttpPost(content){ var token = "ライントークン"; var options = { "method" : "post", "payload" : "message=" + content, "headers" : {"Authorization" : "Bearer "+ token} }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); }

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

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

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

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

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

draq

2019/11/13 08:35

GASが動作しないとは、具体的にどう動作しないんでしょうか?もっと具体的に問題点を書かないと回答はつきにくいかと思います。 あと、投稿前にプレビューを確認してきちんとコード部分が表示されているか確認してから投稿してください。「```」が閉じられていないため、表示が崩れています。「ここに言語を入力」も消してください。
KPS

2019/11/14 07:17

修正しました。 よろしくお願いいたします。
draq

2019/11/14 09:21

次回から > エラーが出ているのは一番上の所です。 だけではなくて、エラーメッセージもお願いします。 またソースはちゃんとインデントをお願いします。GASならWebのエディタ上で「Ctrl+A」→「Shift-Tab」である程度インデントしてくれます。
KPS

2019/11/15 02:15

ありがとうございます。 後はスプレッドシート内の数字が178を超えたら通知できれば完成できそうです
guest

回答2

0

178 時間なんたらだけでよければ、simpleNotifier と sendHttpPost のみで動きます。

が、当初の質問のコードが動きそうになかったので、こうなんじゃないの、というのを書いてます。というかそっちのほうがやりたかったので。

javascript

1// 作りとしてカレンダーidがあるシートに労働者のカレンダーのidが入っていて、カレンダーitemには勤務予定(のみ)が入っているっぽい。 2// しかしカレンダーidとカレンダーitemは個数がそろわない(1人あたり、20日とか勤務するはず 3// なので、意図した動作ができているとは思えない。 4function q222877() { 5 // consts 6 const sheetItem = "Calendar_Item"; 7 const sheetItemHeader = ['カレンダーid','タイトル','開始','終了','差分', '場所']; 8 const sheetIds = "Calendar_ID"; 9 const limit = 178; 10 const today = new Date(); 11 const firstOfThisMonth = new Date(today.getFullYear(), today.getMonth(), 1); 12 const firstOfNextMonth = new Date(today.getFullYear(), today.getMonth() + 1, 1); 13 const sheet = SpreadsheetApp.getActiveSpreadsheet(); 14 // pre 15 const calendarItem = sheet.getSheetByName(sheetItem); 16 resetSheet(calendarItem, sheetItemHeader); 17 // main 18 const colLen = sheetItemHeader.length; 19 const ids = sheet.getSheetByName(sheetIds).getDataRange().getValues().slice(1).map(function(e) { return e[0];}); 20 const events = ids.reduce(function(a,c) {return a.concat(getEvents(e, firstOfThisMonth, firstOfNextMonth))},[]); 21 calendarItem.getRange(2, 1, events.length, colLen).setValues(events); 22 //after 23 ids.filter(function(e) { return events.filter(function(f){ return f[0] === e ;}).reduce(function(a,c) { return a + c[4]},[]) >= limit;}).forEach(sendHttpPost); 24} 25function resetSheet(sheet, header) { 26 sheet.clear(); 27 sheet.AppendRow(header); 28} 29function getEvents(calendarId, start, end) { 30 const calendar = CalendarApp.getCalendarById(calendarId); 31 return calendar.getEvents(start, end).map(function(e) { return eventsToArray(e, calendarId)}); 32} 33function eventsToArray(calendarId, event) { // getOriginalCalendarID で取得可 34 const startTime = event.getStartTime(); 35 const endTime = event.getEndTime(); 36 const duration = (endTime - startTime) / (1000* 60 * 60); 37 return [calendarId, event.getTitle(), startTime, endTime, duration, event.getLocation()]; 38} 39function sendHttpPost(content){ 40 const token = "ライントークン"; 41 const options = 42 { 43 "method" : "post", 44 "payload" : "message=" + content, 45 "headers" : {"Authorization" : "Bearer "+ token} 46 47 }; 48 49 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); 50} 51function simpleNotifier() { 52 SpreadsheetApp.getActive().getSheetByName('就業').getDataRange().getValues().filter(function(e) { return e >= 178;}).forEach(sendHttpPost); 53}

投稿2020/01/11 13:16

papinianus

総合スコア12705

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

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

0

ベストアンサー

JavaScript

1var date = DATE(YEAR(TODAY()),MONTH(TODAY()),1);

JavaScript にDATE()/YEAR()/TODAY()/MONTH()という関数はありません。
VBのソースを元にしたんでしょうか。

今月の1日を取得したいのだと思いますが、JavaScriptなら、

JavaScript

1var today = new Date(); 2var date = new Date(today.getFullYear(), today.getMonth(), 1);

でしょうか。

投稿2019/11/14 09:20

draq

総合スコア2577

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

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

KPS

2019/11/15 02:14

ありがとうございます。無事に習得できました。 スプレッドシートシート内の数字が178を超えたら通知するというのですべて完成できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問