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

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

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

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

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

1891閲覧

スプレッドシートからGoogleカレンダーに予定を登録する際、スプレッドシートの更新行だけを常にカレンダーに登録したいです。

ko1

総合スコア23

Google スプレッドシート

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

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/08/04 07:27

お世話になります。
スプレッドシートからGoogleカレンダーに予定を登録する際、スプレッドシートの更新行だけを常にカレンダーに登録したいです。

下記のコードでスプレッドシートからGoogleカレンダーに登録する事はできましたが、

スプレッドシートは常に更新されており、1日2~3件が登録されます。
ただ下のコードをトリガーで実行するとスプレッドシートに登録されている全スケジュールが都度Googleカレンダーに反映されてしまい、重複しまくりになっている状態です。

スプレッドシートの更新された行のみをGoogleカレンダーに都度反映させる事は可能でしょうか。

お手数ですがGASのご教示の程お願い致します。

スプレッドシート画像
イメージ説明

※Googleカレンダーに記入するためのvar title = sheet.getRangeの複数行の入れ込み方法がわからなかったので、H列にB+C+D+E+Fとし、 var title = sheet.getRange(i,8).getDisplayValues().toString();で収めている状態です。

GAS

1function createEventFromSheet() { 2 // シートを選択 3 var sheet = SpreadsheetApp.getActiveSheet(); 4 5 // 行を選択 6 for(var i = 2; i <= sheet.getLastRow(); i++) { 7 // セルの値を取得 8 var start = sheet.getRange(i, 1).getValue().toString(); 9 var end = sheet.getRange(i, 1).getValue().toString(); 10 var title = sheet.getRange(i,8).getDisplayValues().toString(); 11 12 // タイトルがない場合、終了する 13 if(title.length <= 0) { 14 break; 15 } 16 17 // 開始と終了の日時を取得 18 var startTime = new Date(start); 19 var endTime = new Date(end); 20 21 // オプションを設定 22 var options = { 23 location: " ", 24 description: " " 25 } 26 27 // カレンダーを取得 28 var cal = CalendarApp.getCalendarById( 'カレンダーID' ); 29 30 // カレンダーにイベントを追加 31 cal.createEvent(title, startTime, endTime, options); 32 } 33}

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

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

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

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

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

guest

回答1

0

こんにちは、
スクリプトでイベントを登録したらシートのG行に、cal.createEvent(title, startTime, endTime, options);で返されるオブジェクトからイベントのIDを取得し、イベントIDをシートに書き込むようにし、次にスクリプトを実行する場合にイベントIDが書き込まれている行はスキップするように書いてみました。(G行の最初のセルにイベントIDなどと書けばわかりやすいとおもいます)
イベントに登録するタイトルはH列に書き込まずに済むように、C+D+E+Fのものを空白で区切って取得しています。

以下が参考コードになります。

GAS

1function createEventFromSheet() { 2 // シートを選択 3 var sheet = SpreadsheetApp.getActiveSheet(); 4 // 行を選択 5 for (var i = 2; i <= sheet.getLastRow(); i++) { 6 // セルの値を取得 7 var start = sheet.getRange(i, 1).getValue(); 8 var end = sheet.getRange(i, 1).getValue(); 9 var title = sheet.getRange(i, 3, 1, 4).getValues()[0].join(` `).trim(); 10 // タイトルがない場合、終了する 11 console.log(title); 12 var event_id = sheet.getRange(`G${i}`).getValue().trim(); 13 console.log(event_id); 14 if (title.length <= 0) { 15 console.log(`${i}行目はタイトルがありません。`); 16 } else if (event_id.length > 0) { 17 console.log(`${i}行目は既にカレンダーにイベントを登録済みです。`); 18 } else { 19 // 開始と終了の日時を取得 20 var startTime = new Date(start); 21 var endTime = new Date(end); 22 23 // オプションを設定 24 var options = { 25 location: " ", 26 description: " ", 27 }; 28 // カレンダーを取得 29 var cal = CalendarApp.getCalendarById("superfetch911@gmail.com"); 30 31 // カレンダーにイベントを追加 32 var event = cal.createEvent(title, startTime, endTime, options); 33 event_id = event.getId(); 34 console.log(`カレンダーにイベントを登録しました。`); 35 console.log(`イベントのIDは、${event_id}`); 36 sheet.getRange(`G${i}`).setValue(event_id); 37 } 38 } 39} 40

投稿2021/08/04 15:49

fake_shibe

総合スコア806

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

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

ko1

2021/08/05 01:04

いつもありがとうございます。頂いたコードで実装ができました。大変感謝しております。 大変申し訳ないのですが、もう1点ご質問があります。 LINEからデータを引っ張ってくるシートとは別のシートに=log!B7という形で100行関数を入れ込んでおり、Googleカレンダーに登録するGASを動かすと、毎度100行の処理が始まる状態です。 LINEから引っ張ってきたデータに指定時間(20:15)を超えたら確認という文字がセルに入るようにするため、またGoogleカレンダーに登録するには別シートが必要と思い設定したのですが、この別シートが100行の関数ではなく自動的に次のセルに入力されているという事は可能なのでしょうか。 何度も申し訳ありませんが、よろしくお願い申し上げます。
fake_shibe

2021/08/05 15:22

ちょっと理解が出来なく申し訳ないですが、以下が参考になると思います。 logというシートを取得するには、以下のように出来ます。 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var log_sheet = spreadsheet.getSheetByName(`log`); logというシートのB7の値を取得するには以下で出来ると思います。 var b7_value = log_sheet.getRange(`B7`).getValue(); 値をスプレッドシートに書き込む場合(以下はH列のi行目)は、以下で出来ると思います。logシートに書き込みたい場合sheetをlog_sheetに変えれば良いです。 sheet.getRange(`H${i}`).setValue(`セルにいれたい値`);
ko1

2021/08/10 05:00

ご返信ありがとうございます。お返事が遅くなり申し訳ありません。試行錯誤してみましたが、もう1点問題があり、 LINEからメッセージ→GASでスプレッドシート記入→GASでカレンダー登録の流れで、 トリガーをスプレッドシート編集時または変更時にしておりましたが、動かない事がわかりました。 調べてみるとGASではトリガーを動かす事ができないようで、リアルタイムに反映させたいと考えておりましたが、ここを打開する方法はございますでしょうか? 質問ばかりで申し訳ありませんが、ご教示頂きたいです。よろしくお願い申し上げます。
fake_shibe

2021/08/11 01:36

LINEからメッセージ→GASでスプレッドシート記入→GASでカレンダー登録を、 LINEからメッセージ→【GASでスプレッドシート記入してカレンダー登録】 にして一度に、LINEからメッセージをGASでスプレッドシート記入、間髪入れず連続して予定をカレンダーに登録すれば良いのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問