拳を交わした瞬間にお互いのモノローグが流れ込んでくるんですよ、過去5巻分くらいの
今すごいぐったりしてるけどそりゃこの連勤を走りぬけ推しのライブをこなしてすべてが終わってからの休日の夜にワイン飲んだんだからそりゃぐったりするわ
わかると思うけどコードの中の
・★☆★「GoogleTRPGカレンダー」のカレンダーID★☆★
・★☆★「デイコードカレンダーiCal」のカレンダーID★☆★
は該当するIDを調べて入れてください(手順に載せ忘れた
すげえ長くなったけどデイコードの予定をGoogleカレンダーに過去予定を消さずに自動連携していく忘備録を乗せておきました。
何かの参考になれば幸いです。
RE: https://trpger.us/notes/9sd5se68ob
■□■□■□■□■□■□■□■□■
デイコードからGoogleカレンダーに
(過去予定も含めて)転記する忘備録
■□■□■□■□■□■□■□■□■
◯必要なもの
・googleカレンダー
・PixivFanBOXでの『Discord連携日程調整サービス「デイコード」支援プラン』の支援(300円/月)
→ https://kg-masashige.fanbox.cc/plans
◯手順
1.上記の支援プランで支援を行う
2.デイコードのユーザーページで「iCal形式で予定を公開する」のチェックボックスをつけて機能を有効化する
3.Googleカレンダーを開き、他のカレンダーの「+」から「URLで追加」を選択し、上記のiCal形式のURLを貼り付ける。名前はわかりやすいものにしてOK。(ここでは「デイコードカレンダーiCal」と称する)
4.Googleカレンダーで表示したいマイカレンダーを1つ作成する。(ここでは「GoogleTRPGカレンダー」と称する)
5.Google Driveを開き、スプレッドシートを作成して開く。名前は適当でいいが消さないように「デイコード共有用」とか。
6.「拡張機能」から「Apps Script」を選ぶ。
7.コードは以下の通り。とりあえずコピペ。
/**
* 複数のカレンダーの予定を別のカレンダーにコピーしていく関数
* トリガーで1日1回実行することを想定
*/
function mergeCalendarEvents() {
/* 予定を結合させたいコピー先カレンダーのID */
const idMergedCal = '★☆★「GoogleTRPGカレンダー」のカレンダーID★☆★';
/* 予定のコピー元のカレンダーの配列 ['','']; */
const idsCopyFrom = ['★☆★「デイコードカレンダーiCal」のカレンダーID★☆★'] ;
/* 後で削除する時のためのタグのキーと値 */
// https://developers.google.com/apps-script/reference/calendar/calendar-event#setTag(String,String)
const key = 'gas';
const tag = 'copied';
/* 操作する期間を指定 */
const term = 168; // 予定をコピーする期間(日数)を指定
const now = new Date(); // 現在日時を取得
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0); // 今日の日付 00:00:00を取得
const yesterday = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1, 0); // 昨日の日付 00:00:00を取得
const endBefore = new Date(today.getFullYear(), today.getMonth(), today.getDate() + term, 0); // この日付の前日までの予定を操作
// コピー先のカレンダーの取得
const calMerged = CalendarApp.getCalendarById(idMergedCal);
/* 過去に登録した予定でタグが付与されているものを重複防止の為に削除 */
const overlapEvents = calMerged.getEvents(today, endBefore); // yesterdayをtodayにすれば過去の予定は残る
overlapEvents.forEach(event => {
if (event.getTag(key) === tag) {
event.deleteEvent();
Utilities.sleep(1000); // カレンダーの連続操作はエラーになりやすい
};
});
/* コピー元のカレンダーから予定をタグを付与してコピー */
idsCopyFrom.forEach(id => {
const calCopyFrom = CalendarApp.getCalendarById(id); // カレンダーオブジェクトをIDから取得
copyEventsBlock_(calCopyFrom, today, endBefore, calMerged, key, tag);
});
}
/**
* タグを付与しながら指定期間のイベントを別のカレンダーにコピーしていく関数
*
* @param {Object} calCopyFrom - 予定のコピー元カレンダーオブジェクト
* @param {Object} startFrom - 予定コピーの開始日(Dateオブジェクト)
* @param {Object} endBefore - 予定コピーの終了日(Dateオブジェクト)※操作対象日に含まれない
* @param {Object} calCopyTo - 予定のコピー先カレンダーオブジェクト
* @param {string} key - イベントオブジェクトに付与するキー(カレンダーUIでは不可視)
* @param {string} tag - イベントオブジェクトに付与するキーとペアになる値(カレンダーUIでは不可視)
* @return
*/
function copyEventsBlock_(calCopyFrom, startFrom, endBefore, calCopyTo, key, tag) {
// コピーする予定を非公開に
const visibility = CalendarApp.Visibility.PRIVATE;
// カレンダー内の予定を取得
const events = calCopyFrom.getEvents(startFrom, endBefore);
// カレンダー内の予定を一つずつコピーしていく
for (const event of events) {
//終日イベントか時間単位イベントか判別
if (event.isAllDayEvent()) {
const title = event.getTitle(); //コピー元予定のタイトルを取得
const startDate = event.getAllDayStartDate(); //コピー元予定の開始日を取得
const endDate = event.getAllDayEndDate(); //コピー元予定の終了日を取得
// 新しい非公開イベントを作成し各値とタグを付与
// タイトルにはコピーされた予定とわかるように
const copiedAllDayEvent = calCopyTo.createAllDayEvent(`${title}[連携済]`, startDate, endDate).setTag(key, tag).setVisibility(visibility);
copiedAllDayEvent.setColor(CalendarApp.EventColor.YELLOW); // イベントのカラーを指定 https://developers.google.com/apps-script/reference/calendar/event-color
Utilities.sleep(1000);
} else {
const title = event.getTitle(); //コピー元予定のタイトルを取得
const startTime = event.getStartTime(); //コピー元予定の開始時間を取得
const endTime = event.getEndTime(); //コピー元予定の終了時間を取得
// 新しい非公開イベントを作成し各値とタグを付与
// タイトルにはコピーされた予定とわかるように
const copiedEvent = calCopyTo.createEvent(`${title}[連携済]`, startTime, endTime).setTag(key, tag).setVisibility(visibility);
copiedEvent.setColor(CalendarApp.EventColor.YELLOW); // イベントのカラーを指定 https://developers.google.com/apps-script/reference/calendar/event-color
Utilities.sleep(1000);
}
}
}
(参考元: https://freeelover.com/2022/08/gas/gas%E6%B4%BB%E7%94%A8%E6%B3%95/683/ )
8.テストしてエラーなければデプロイ。
9.左側の時計マークを選ぶと「トリガー」が選べるので時間ベースで1日1回深夜のどこかの時間などでトリガーにする。00分ジャストだと負荷が集中することを鑑みて適当な分数にしておくとベター。
以上です。
このアカウントは、notestockで公開設定になっていません。
久々に寝る前のポケカ。
ジュナイパーexデッキで完封。まぁ手札の周りがお互い悪い悪い……。
「とりあえずこのデッキは多分コレとコレで耐え抜きながらこの進化を待つしかないかな。あとちゃんとエネルギーつけて逃げること
「そんなん考えるのむりでしょ!!」
デイコードとtimetree連携ができなくなったからiCal連携から古い予定も消さずにGoogleカレンダーにする手法をノートにまとめようかと思いつつ今に至る
吉祥寺いいとこ一度はおいで
いえ、嘘です。
休日の吉祥寺は地元民以外が多くて地元ティとしては人が増えて欲しくないです。道が1|¥*((9☆
正解:R=194、G=227、B=204
予想:R=221、G=245、B=238
得点は88/100点!
スゴイ! もう実質満点にゃん
https://trpger.us/play/9s63eo9hlx
もー!!!
正解:R=237、G=95、B=29
予想:R=212、G=135、B=65
得点は84/100点!
スゴイ! もう実質満点にゃん
https://trpger.us/play/9s63eo9hlx
だめだー
このアカウントは、notestockで公開設定になっていません。