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

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

元の名称　　：「会議室101」
変更後の名称：「会議室111」
⇒一括で場所を「会議室111」に変更する方法をご案内します！
※今回は複数の会議室分を一括で変更する方法とします。

#【まとめ】
下記の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 ：予定抽出

１．対象のリソースの予約を抽出
２．変更後の場所のテキストを設定
　　⇒こちらは手作業でE列を埋めてください！
３．Event IDをキーにして一括更新

##１．対象のリソースの予約を抽出
```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順にソートをかけています

##３．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('変更済');
    }    
  }
}
```
⇒チェック列に無視が入っているもの以外は、ロケーションを変更します！

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