kintoneレコードから条件を付けてGoogleカレンダー登録したい

条件分岐の記載方法がわからずに質問させて頂きます。どなたかご回答いただけますと大変助かります…!!

 

■背景・実現したいこと

kintoneレコードに登録した情報から、条件によってGoogleカレンダーにイベント作成および更新をかけたい。

具体的には

①レコードにkintoneユーザの登録あり⇒Googleカレンダーのゲスト登録する

②レコードにkintoneユーザの登録なし⇒Googleカレンダーのゲスト登録しない(できない)

※条件分岐の記述をしないと、②に該当したときにエラーになって保存できないですが、記載方法がわからずに困っております。

 

■参考にしたページ

https://developer.cybozu.io/hc/ja/articles/115005646066-kintone%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88-%E3%83%95%E3%82%A7%E3%82%A2%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE%E6%97%A5%E7%A8%8B%E3%82%92Google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AB%E5%85%AC%E9%96%8B%E3%81%97%E3%82%88%E3%81%86-

 

■実際に機能しているコード

下記コード内、「ゲストの追加」の部分を分岐させたいです

(function() {
  'use strict';

  // API キー
  const api_key = '××××××××××';
  // クライアントID
  const client_id = '××××××××××';
  // 認証用URL(読み取り/更新)
  const scope = 'https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.events';
  // Discovery Docs
  const discovery_docs = ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest'];

  // APIクライアントライブラリの初期化とサインイン
  function initClient() {
    gapi.client.init({
      'apiKey': api_key,
      'discoveryDocs': discovery_docs,
      'clientId': client_id,
      'scope': scope
    }, (error) => {
      alert('Googleへの認証に失敗しました。: ' + error);
    });
  }

  // APIクライアントとOAuth2ライブラリのロード
  gapi.load('client:auth2', initClient);

  // レコード詳細画面の表示後イベント
  kintone.events.on('app.record.detail.show', (event) => {
    // 増殖バグ回避
    if (document.getElementById('publish_button') !== null) {
      return event;
    }
    // 画面下部にボタンを設置
    const publishButton = document.createElement('button');
    publishButton.id = 'publish_button';
    publishButton.innerHTML = 'Googleカレンダー公開する';
    publishButton.className = 'button-simple-cybozu geo-search-btn';
    publishButton.style = 'margin-top: 30px; margin-left: 10px;';
    publishButton.addEventListener('click', () => {
      publishEvent();
    });
    kintone.app.record.getSpaceElement('××××××××××').appendChild(publishButton);
    return event;
  });

  kintone.events.on(['app.record.create.show', 'app.record.edit.show'], (event) => {
    // フィールドを編集不可へ
    event.record.event_id.disabled = true;
    return event;
  });

  async function publishEvent() {
    // レコードのデータの取得
    const record = kintone.app.record.get().record;
    if (record) {
      // Google認証済みのチェック
      if (!gapi.auth2.getAuthInstance().isSignedIn.get()) {
        // Google認証の呼び出し
        await gapi.auth2.getAuthInstance().signIn();
      }
      // API リクエスト
      // リクエストパラメータの設定
      const params = {
        // イベントのタイトル
        'summary': record.event_name.value,
        'calendar_id': record.calendar_id.value,
        'start': {
          // 開始日・時刻
          'dateTime': record.start_datetime.value,
          'timeZone': 'Asia/Tokyo'
        },
        'end': {
          // 終了日・時刻
          'dateTime': record.end_datetime.value,
          'timeZone': 'Asia/Tokyo'
        },
        // 場所の指定
        'location': record.event_location.value,
        'attendees': [
    {
      // ゲストの追加
      'email': record.attendees.value
    }],
        // イベントの説明
        'description': record.event_description.value
      };
      let request;
      // リクエストメソッドとパラメータの設定
      if (record.event_id.value) { // 公開済みイベントを更新
        request = gapi.client.calendar.events.update(
          {
            'calendarId': record.calendar_id.value,
            'eventId': record.event_id.value,
            'resource': params
          });
      } else { // 未公開のイベントを追加
        request = gapi.client.calendar.events.insert(
          {
            'calendarId': record.calendar_id.value,
            'resource': params
          });
      }
      // Googleカレンダーへのイベント登録の実行
      request.execute((resp) => {
        if (resp.error) {
          alert('イベントの登録に失敗しました。' + resp.error.message);
        } else {
          const body = {
            'app': kintone.app.getId(),
            'id': record.$id.value,
            'record': {
              'event_id': {
                'value': resp.result.id
              }
            }
          };
          return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', body).then((success) => {
            alert('カレンダーにイベントを登録しました。');
            location.reload();
          }).catch((error) => {
            alert('Google イベントIDの登録に失敗しました。' + error);
          });
        }
        return true;
      }, (error) => {
        alert('Google イベントIDの登録に失敗しました。' + error);
      });
    }
  }
})();

mimi様

      // ゲストの追加
      'email': record.attendees.value

ここで,条件によって空欄になれば良い,という解釈でしょうか.
また,レコード内にkintoneユーザーの情報はありますか?
(attendeesがそうでしょうか)

TO様

ご覧いただきありがとうございます。

条件によって「attendees」が入力されたり、されていなかったりするので(その運用は入力者によります)

「attendees」 という項目が空欄の場合はGoogleカレンダーのゲスト登録をしない、

「attendees」 という項目に入力があれば、そこに記載されたユーザをゲスト登録してGoogleカレンダーのイベント作成/更新を実行したい

という状況です。

 

「attendees」は 文字列(1行) の項目で、「担当営業」という ユーザー選択 で選択されたユーザのメールアドレス値が入力されるような仕様になっております。

 

 

 async function publishEvent() {
   // レコードのデータの取得
   constrecord = kintone.app.record.get().record;
   if(record) {
     // Google認証済みのチェック

ここのif(…の下に、

 async function publishEvent() {
   // レコードのデータの取得
   constrecord = kintone.app.record.get().record;
   if(record) {
//attendeesチェック
    if (!record.attendees.value){
alert('担当営業のメールアドレスが入力されていません');
return;
}
     // Google認証済みのチェック

…とするのはいかがでしょうか。
シンプルにattendeesが空であれば先に進まずにreturnするようにしています。

TO様

ご丁寧にありがとうございます…!!大変ありがたいです。

もしさらに伺ってもよろしければ、教えていただきたいのですが、

attendeesが空であればアラートとするのではなく、

カレンダーのイベント登録/更新は実行したうえで、ゲスト登録しない、という回避方法にしたいのですが可能でしょうか。(他のカレンダータイトルや日時情報は更新する)

JSの知識に乏しく恐縮ですが、教えていただけますとありがたいです。

mimi様

「email」を空にする,のではエラーになるんですよね?
そう仮定するなら,IF分岐でparamsの"attendees"の配列を空にするのはどうでしょうか,
最初に投稿いただいたコードの,

        'attendees': [
    {
      // ゲストの追加
      'email': record.attendees.value
    }],
        // イベントの説明

ここを,

          'attendees': (record.attendees.value?[{
          // ゲストの追加
          'email': record.attendees.value
        }]:[]),
            // イベントの説明

…として挙動を見てみてください.
三項演算子を使って,record.attendees.valueに値があったら’email’: record.attendees.value,
値がなかったら空の配列[]を’attendees’: に入れます.

本来なら別のところでIF分岐するのが良いと思ったのですが,
「どこを変えたのか」がわかるように,すこし無理やりねじ込んでいます.

本来であれば

let arrAttendees = [];
if (record.attendees.value){
  arrAttendees = [{
          // ゲストの追加
          'email': record.attendees.value
        }]
}

~~~

'attendees': arrAttendees,

…という感じになるかと思います.

三項演算子については下記を参照ください.
条件 (三項) 演算子 - JavaScript - MDN Web Docs

TO様

まさにやりたいことが実現できました。。。誠に感謝申し上げます!!大変助かりました…!!

ご丁寧に解説も記載いただき、本当にありがとうございました!!