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

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

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

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

Google カレンダー

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

Google Apps Script

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

Q&A

解決済

2回答

1401閲覧

【GAS】GASを使って複数メンバーのGoogleカレンダーをスプレッドシートに取り込みたいがエラーになる

j3ta6

総合スコア19

Google スプレッドシート

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

Google カレンダー

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/02/05 10:50

前提・実現したいこと

複数のgoogleカレンダーの情報をスプレッドシートに取り込みたい。

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

こちらの記事を参考にしているのですが
https://qiita.com/Bzbot/items/b92ca277ad95b7b4cf89

エラー:引数が無効です var calenderId = sheet.setActiveSheet(sheet.getSheetByName("Calender_ID"));

と表示されます。
スプレッドシートの名前をCalender_IDにコピペしてスクリプト実行すると、

次のエラー
TypeError: null のメソッド「getEvents」を呼び出せません。
var calendarId = sheet.setActiveSheet(sheet.getSheetByName("Calendar_ID"));

となります。

該当のソースコード

//対象の日付を範囲指定
var date = '2020/01/01';
//アクティブなシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet();
//「Calendar_ID」のシートをアクティブにして、シート情報をcalendarIdに取得
var calendarId = sheet.setActiveSheet(sheet.getSheetByName("Calendar_ID"));
//「Calendar_Item」のシートをアクティブにして、シート情報をcalendarItemに取得
var sheet1 = SpreadsheetApp.getActiveSpreadsheet();
var calendarItem = sheet1.setActiveSheet(sheet1.getSheetByName("Calendar_Item"));

//現在の入力されてる値を初期化
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('所要時間');
calendarItem.getRange('F'+(1)).setValue('詳細');
calendarItem.getRange('G'+(1)).setValue('住所');

//CalendarIDが入っている最終行を取得(固定)
var lastR1 = calendarId.getLastRow();
Logger.log("【lastR】:" + lastR1);

//セットされているIDのリストを順番に取得してgetCalに引数として渡す
for (var i = 1; i < lastR1 ; i++){
//予定表が入っている最終行を取得(可変)
var lastR2 = calendarItem.getLastRow();
Logger.log("【lastR】:" + lastR2);

//カレンダーIDを指定して、カレンダーを取得 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);

//この時はまだfrom,end両方に変数dateで指定した日付が入っている
var from= new Date(date); 
var end = new Date(date);
//月を指定するときは必ず大文字のMMを指定します(半角mmだとminutesを指してしまう)
//endのMonthm(月)に+1をして翌月を指定
end.setMonth(end.getMonth()+1);
//getEventsで取得したいカレンダーの始まりと終わりを指定
var events = calendar.getEvents(from, end);

//eventsに入っている要素の数だけ実行
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;

}

}

### 試したこと まったくどうしたらよいかわからず迷走しております。 みなさま、助けてください。 ### 補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

papinianus

2020/02/05 11:31

この状態から解決にいたるにはスプレッドシートにある全てのシートの名前とスクリーンショットが必要です。 もしくは、これを実行するユーザ(質問者様のgoogleaccount)に共有されているカレンダーは全てシートに書き出してよいのでしょうか?
j3ta6

2020/02/05 12:45

ご回答ありがとうございます! 共有されているカレンダーは全てシートに書き出したいです。 どうぞ宜しくお願い致します。
guest

回答2

0

別解

スプレッドシートの名前をCalender_IDにコピペしてスクリプト実行すると、

スプレッドシートの名前ではなく、参考サイトにある、カレンダーidがずらっとうまっているはずのシート(タブ)の名前をコピペして使います。
というか、そのシート(タブ)の名前を Calendar_ID にしたほうがいいのかもしれないです。

同じく、イベントが書かれるシート(タブ)の名前は Calendar_Item にします。

多分、今発生しているエラーはこのへんで解消すると思いますが、これはかなり手前の準備事項なのでスプレッドシートを見てもらえるくらい親しい人で話の分かる人を見つけたほうがいいです。

投稿2020/02/05 13:03

papinianus

総合スコア12705

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

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

j3ta6

2020/02/05 14:08

ご親切にありがとうございます。 教えていただいた方法でも試してみます。
papinianus

2020/02/05 14:23

やりたかった回答が動作したので、こちらは確認しません。
guest

0

ベストアンサー

javascript

1function q239651() { 2 const sheet = SpreadsheetApp.getActive().getSheets()[0]; 3 sheet.getDataRange().clearContent(); 4 sheet.appendRow(["id", "title", "starts", "ends", "description", "loc"]); 5 const today = new Date(); 6 const startdate = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // today 7 const enddate = new Date(today.getFullYear(), today.getMonth() + 1, today.getDate()); // 1 month later 8 const evts = getEvents(startdate, enddate).reduce(function (ac, ar) { 9 return ac.concat(ar[1].map(function (ev) { 10 return eventToArray(ar[0], ev); 11 })); 12 }, []); 13 if (evts.length < 1) return; 14 sheet.getRange(2, 1, evts.length, 6).setValues(evts); 15} 16 17function getEvents(startdate, enddate) { 18 return CalendarApp.getAllCalendars().map(function (cal) { 19 return [cal.getName(), cal.getEvents(startdate, enddate)]; 20 }).filter(function (e) { 21 return e[1].length > 0; 22 }); 23} 24 25function eventToArray(id, event) { 26 return [id, event.getTitle(), event.getStartTime(), event.getEndTime(), event.getDescription(), event.getLocation()]; 27}

投稿2020/02/05 12:58

papinianus

総合スコア12705

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

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

papinianus

2020/02/05 12:59

動作未確認。動かなかったら、この回答はあきらめてください。
papinianus

2020/02/05 13:01

説明。 ちゃんと動いたら、左端のシートに今日から1ヶ月分のイベントが埋まる。
j3ta6

2020/02/05 13:19

やってみます!
papinianus

2020/02/05 14:23

別の質問対応でカレンダーを開いたので検証しました。左端のシートに今日から1ヶ月分のイベントが埋まりました。
j3ta6

2020/02/06 02:10

全て抽出されました!ありがとうございます。 やりたいことができました。 今後は空き時間のみ抽出するを試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問