@kokkerun (kousuke ikeda)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GoogleスプレッドシートからGoogleカレンダーに予定を登録する際に色を指定したい

解決したいこと

上記サイトを参考にして、
スプレッドシートから
グーグルカレンダーに予定を
登録したところ、

1色(デフォルト)で登録することができました。
Screenshot 2021-05-24 at 0.46.13.png

この予定を登録する時に、
別の色で登録したいのですが、
GASのスクリプトに何を追加または、
削除すればよいのかわかりません。

こちらのサイト
https://for-dummies.net/gas-noobs/how-to-set-color-to-calendar-events-by-gas/
が参考になるかと思い、

試してみたのですがうまくいきません。
現在のスクリプトは以下のような状態となっております。

/**
* スプレッドシート表示の際に呼出し
*/
function onOpen() {

var ss = SpreadsheetApp.getActiveSpreadsheet();

//スプレッドシートのメニューにカスタムメニュー「カレンダー連携 > 実行」を作成
var subMenus = [];
subMenus.push({
name: "実行",
functionName: "createSchedule" //実行で呼び出す関数を指定
});
ss.addMenu("カレンダー連携", subMenus);

}

/**
 * 予定を作成する
 */
```function createSchedule() {

  // 連携するアカウント
  const gAccount = "自分の@gmail.com";

  // 読み取り範囲(表の始まり行と終わり列)
  const topRow = 6;
  const lastCol = 9;



  // 0始まりで列を指定しておく
  const statusCellNum = 1;
  const dayCellNum = 2;
  const startCellNum = 4;
  const endCellNum = 5;
  const titleCellNum = 6;
  const locationCellNum = 7;
  const descriptionCellNum = 8;

  // シートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 予定の最終行を取得
  var lastRow = sheet.getLastRow();

  //予定の一覧を取得
  var contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();

  // googleカレンダーの取得
  var calender = CalendarApp.getCalendarById(gAccount);

  //順に予定を作成(今回は正しい値が来ることを想定)
  for (i = 0; i <= lastRow - topRow; i++) {

    //「済」っぽいのか、空の場合は飛ばす
    var status = contents[i][statusCellNum];
    if (
      status == "済" ||
      status == "済み" ||
      status == "OK" ||
      contents[i][dayCellNum] == ""
    ) {
      continue;
    }

    // 値をセット 日時はフォーマットして保持
    var day = new Date(contents[i][dayCellNum]);
    var startTime = contents[i][startCellNum];
    var endTime = contents[i][endCellNum];
    var title = contents[i][titleCellNum];
    // 場所と詳細をセット
    var options = {location: contents[i][locationCellNum], description: contents[i][descriptionCellNum]};


    try {
      // 開始終了が無ければ終日で設定
      if (startTime == '' || endTime == '') {
        //予定を作成
        calender.createAllDayEvent(
          title,
          new Date(day),
          options,

        );


      // 開始終了時間があれば範囲で設定
      } else {
        // 開始日時をフォーマット
        var startDate = new Date(day);
        startDate.setHours(startTime.getHours())
        startDate.setMinutes(startTime.getMinutes());
        // 終了日時をフォーマット
        var endDate = new Date(day);
        endDate.setHours(endTime.getHours())
        endDate.setMinutes(endTime.getMinutes());

        // 予定を作成
        calender.createEvent(
          title,
          startDate,
          endDate,
          options,


        )
      }

      //無事に予定が作成されたら「済」にする
      sheet.getRange(topRow + i, 2).setValue("済");

    // エラーの場合(今回はログ出力のみ)
    } catch(e) {
      Logger.log(e);
    }

  }
    //予定の表示色を設定するコード
function sampleCodeForCalendarAppSetColor() {
  var calendar = CalendarApp.getDefaultCalendar();
  var date = new Date(); 
  var events = calendar.getEventsForDay(date);
  var color = CalendarApp.EventColor.CYAN;
  for (var i in events) {
    var event = events[i];
    event.setColor(color);
  }
}
  // ブラウザへ完了通知
  Browser.msgBox("完了");
}

予定の表示色を〜
event.setColor(color);
}
までが自身で追加した
部分になります。

ご教授いただきましたら
幸いです。

0 likes

5Answer

予定登録時に色が決まっているのなら、たとえば calender.createEvent(... のところを var event = calender.createEvent(... としておいて、event.setColor(... すれば良いと思います。

0Like

Comments

  1. @kokkerun

    Questioner

    ご回答ありがとうございます!!
    早速試してみます!!

// 予定を作成
var event = calender.createEvent(
title,
startDate,
endDate,
options,
event.setColor(CalendarApp.EventColor.RED)

    )
  }
      
  //無事に予定が作成されたら「済」にする
  sheet.getRange(topRow + i, 2).setValue("済");

// エラーの場合(今回はログ出力のみ)
} catch(e) {
  Logger.log(e);
}

}

// ブラウザへ完了通知
Browser.msgBox("完了");
}

上記のように変更してみましたが、
予定を登録することはできませんでした。

Screenshot 2021-05-25 at 2.48.55.png

グーグルカレンダーの方でなにか色を先に用意しておくなど
別の操作が必要なのでしょうか?

ご教授いただけたのに、
実践できなくて申し訳ないですが、
どなたかまたご回答いただけましたら
幸いです。

0Like
  var event = calender.createEvent('title', new Date(), new Date(), {});
  event.setColor(CalendarApp.EventColor.RED)

これで試したらちゃんと動作しましたよ。
新たに書かれたコードだとoptionsの後ろに,があって()が閉じていないので文法エラーになっているのでは?

0Like

ご連絡遅れすみません。

無事色を指定したもので実行することができました。
本当に本当にありがとうございます。

しかし新たな問題が一つ発生しました。

実行したスケジュールを確認したところ、
Screenshot 2021-05-30 at 17.47.19.png

上記のように日時やタイトルを指定できないものと
なってしまいました。

Screenshot 2021-05-30 at 17.52.10.png

上記のようなスプレッドシートに日時等を入力し、
スクリプトを実行したときに入力できるようにしたいと
考えております。

しかし、現状

// 予定を作成
var event = calender.createEvent('title', new Date(), new Date(), {});
event.setColor(CalendarApp.EventColor.MAUVE)
}

こちらのスクリプトの中のnew Dateの箇所を修正していますが、
うまくいきません。

どなたか、もしおわかりの方
ご教授いただけましたら
幸いです。

0Like

こんな風にされているわけですよね?

var startTime = ...
var endTime = ...
var title = ...
var options = ...
var event = calender.createEvent(title, startTime, endTime, options);

多分、どれかのデータがおかしいのではないでしょうか。
そこで、こんな風にconsole.logを埋め込んでみましょう。

var startTime = ...
var endTime = ...
var title = ...
var options = ...
console.log(title);
console.log(startTime);
console.log(endTime);
console.log(options);
var event = calender.createEvent(title, startTime, endTime, options);

で、スクリプト エディタでcreateScheduleを選んで実行をクリックします。
image.png
すると実行ログが出てconsole.logの出力でデータの内容を確認できます。

0Like

Comments

  1. @kokkerun

    Questioner

    早速やってみます!!!
    ご返信ありがとうございます!
  2. @kokkerun

    Questioner

    // 開始終了時間があれば範囲で設定
    } else {
    // 開始日時をフォーマット
    var startDate = new Date(day);
    startDate.setHours(startTime.getHours())
    startDate.setMinutes(startTime.getMinutes());
    // 終了日時をフォーマット
    var endDate = new Date(day);
    endDate.setHours(endTime.getHours())
    endDate.setMinutes(endTime.getMinutes());
    // 予定を作成
    var event = calender.createEvent(title,
    startDate,
    endDate,
    options

    );
         event.setColor(CalendarApp.EventColor.MAUVE)
    }

    上記のようにしてあります
  3. @kokkerun

    Questioner

    無事うまくいきました!!!
    本当にありがとうございます!

    GASが全然わからなかったのですが、
    どの記述が何を指しているかを
    自分なりに復習してみようと思います。

    良い機会を提供いただき
    本当にありがとうございました。

Your answer might help someone💌