#【まえがき】
『リソースの公開後、予定が作成された後に
名称を変更したが、予定の【場所】に表示される文字列まで、
反映されなくて困ってるんです。。。』
そんな問い合わせがあり、作成しました。
元の名称 :「会議室101」
変更後の名称:「会議室111」
⇒一括で場所を「会議室111」に変更する方法をご案内します!
※今回は複数の会議室分を一括で変更する方法とします。
#【まとめ】
下記の3つの手順で行います。
1.対象のリソースの予約を抽出
2.変更後の場所のテキストを設定
3.Event IDをキーにして一括更新
#【ポイント】
同一Event IDにて複数のリソースを招待している場合の対処は?!?!
#【作成したもの】
####★SpreadSheet × 1
処理用シート:データ抽出⇒メンテ⇒アップデートに使用
C2セル:抽出基準 開始日
E2セル:抽出基準 終了日
A列:リソースID
B列:EventID
C列:チェック列(後程説明)
D列:予定のタイトル
E列:変更後の場所のテキスト記入用
F列:抽出元リソース名(特に処理に影響なし)
G列:抽出したEventの場所
H列:予定の日時
I列:処理結果記入用
※1行目:見栄え上、空白行
3行目:ヘッダー行
4行目~実データ行
としてありますので、下記ソース上ではそれを前提に見てくださいね。
マスタシート:抽出時に使用(抽出対象のリソース名称およびリソースIDを管理)
A列:リソース名
B列:リソースID
####★AppsScript × 3
getCal :予定の抽出
sort :抽出した予定のソート
locationUpdate :予定抽出
1.対象のリソースの予約を抽出
2.変更後の場所のテキストを設定
⇒こちらは手作業でE列を埋めてください!
3.Event IDをキーにして一括更新
##1.対象のリソースの予約を抽出
function getCalAll(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var mstsheet = sheet.getSheetByName('マスタ');
var batsheet = sheet.getSheetByName('処理用');
var dataRange2 = batsheet.getRange("C2:C2");
var StartDay = dataRange2.getValues();
var dataRange3 = batsheet.getRange("E2:E2");
var EndDay = dataRange3.getValues();
var index = 4;
var m = 1;
var range = mstsheet.getDataRange();
for (var l = range.getRow(); l < range.getLastRow(); ){
var l = l + 1;
var m = m + 1;
var calmst = mstsheet.getRange(l,2);
var caladdress = calmst.getValues();
var cal = CalendarApp.getCalendarById(caladdress);
var evts = cal.getEvents(
new Date(StartDay),
new Date(EndDay));
var calnm = mstsheet.getRange(m,1);
var calname = calnm.getValues();
var address = caladdress[0];
var address = address[0];
if (evts.length > 0){
for (var i in evts){
var evt = evts[i];
batsheet.getRange(index, 1).setValue(address);
batsheet.getRange(index, 2).setValue(evt.getId());
var count = index -1;
batsheet.getRange(index, 3).setFormula('=if(B'+index+'=B'+count+',"無視","")');
batsheet.getRange(index, 4).setValue(evt.getTitle());
batsheet.getRange(index, 6).setValue(calname);
batsheet.getRange(index, 7).setValue(evt.getLocation());
batsheet.getRange(index, 8).setValue(evt.getStartTime());
batsheet.getRange(index, 9).setValue(evt.getCreators());
index++;
}
}
}
sort(); //sort処理を呼び出し
}
batsheet.getRange(index, 3).setFormula('=if(B'+index+'=B'+count+',"無視","")');
⇒同一Event IDにて複数のリソースを招待している場合は1件以外は
C列:チェック列に無視が入るようにしています
function sort() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('処理用');
var range = sheet.getRange('A4:I');
range.sort([8,2]);
}
⇒日時、予定ID順にソートをかけています
##3.Event IDをキーにして一括更新
function locationUpdate(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var batsheet = sheet.getSheetByName('処理用');
var SheetValues = batsheet.getDataRange().getValues(); //シートのデータを取得
var LastRow = batsheet.getLastRow(); //最後の行番号を取得
for(var i = 4;i < LastRow+1;i++){
var flg = SheetValues[i-1][2];
if(flg !== '無視'){ //無視は飛ばします!
var caladdress = SheetValues[i-1][0];
var cal = CalendarApp.getCalendarById(caladdress);
var calid = SheetValues[i-1][1];
var newLocation = SheetValues[i-1][4];
var evts = cal.getEventSeriesById(calid);
evts.setLocation(newLocation) //ここでロケーションをセット!
batsheet.getRange([i], 10).setValue('変更済');
}
}
}
⇒チェック列に無視が入っているもの以外は、ロケーションを変更します!
#【あとがき】
基本的にあまり運用開始後のリソース名称の変更はないかもしれませんが、
新規リソース作成した少し後に同様の事象が発生したらぜひご利用ください!