Help us understand the problem. What is going on with this article?

リソース名を変更してもカレンダーの場所が変わらない。そんな時は・・・

More than 3 years have passed since last update.

【まえがき】

『リソースの公開後、予定が作成された後に
名称を変更したが、予定の【場所】に表示される文字列まで、
反映されなくて困ってるんです。。。』
そんな問い合わせがあり、作成しました。

元の名称  :「会議室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.対象のリソースの予約を抽出

getCal.gs 予定の抽出処理
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列:チェック列に無視が入るようにしています

sort.gs
function sort() {  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('処理用');    
  var range = sheet.getRange('A4:I');
  range.sort([8,2]);
}

⇒日時、予定ID順にソートをかけています

3.Event IDをキーにして一括更新

locationUpdate.gs
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('変更済');
    }    
  }
}

⇒チェック列に無視が入っているもの以外は、ロケーションを変更します!

【あとがき】

基本的にあまり運用開始後のリソース名称の変更はないかもしれませんが、
新規リソース作成した少し後に同様の事象が発生したらぜひご利用ください!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away