GoogleスプレッドシートからGoogleカレンダーにインポート(重複防止)

Pocket

以前、GoogleスプレッドシートからGoogleカレンダーにインポートという記事を書いたのですが、いくつか質問をいただいて、その中に「スプレッドシートとカレンダーを同期させたい」というのがありました。

前回、紹介した方法は同期でなくインポートなので、二度実行すると同じイベントが二回追加されてしまいます。
今回はこれを防ぐ方法を紹介します。詳細は前回の記事を参考にしてください。
既に前回のコードを使用している場合は、今回のコードに差し替えてください。

スプレッドシート

sheet

右端に「Calendar」という列を作りました。
イベントを追加するとここに「追加済み」という文字列がセットされます。

コード

function createEventFromSheet2() {
  var sheet, i, myevent, mystart, myend, mylocation,
    added;
  sheet = SpreadsheetApp.getActiveSheet();
  for(i = 2; i <= sheet.getLastRow(); i++) {
    myevent = sheet.getRange(i, 1)
      .getValue();
    mystart = sheet.getRange(i, 2)
      .getValue();
    myend = sheet.getRange(i, 3)
      .getValue();
    mylocation = sheet.getRange(i, 4)
      .getValue();
    added = sheet.getRange(i, 5).getValue();
    if(added == "") {
      thisevent = CalendarApp.getDefaultCalendar()
        .createEvent(myevent, mystart, myend, {
          location: mylocation
        });
      sheet.getRange(i, 5).setValue("追加済み");
    }
  }
}

5列目(Calendarの列)が空欄の場合、カレンダーに追加し、この列に「追加済み」という文字列を追加します。
次回以降は、この列に文字列がある行については処理しません。

場所によって登録先カレンダーを振り分ける

(2016年2月11日追記)
「会議のイベントを登録する際に会議室によって登録先のカレンダーを振り分けたい」というコメントをいただきました。
上のコードではデフォルトカレンダーに登録されますがIDを指定することで任意のカレンダーに登録することができます。
GoogleスプレッドシートからGoogleカレンダーにインポート | You Look Too Cool
これを踏まえてlocationが
「会議室1」ならば「xxxxx@group.calendar.google.com」、
「会議室2」ならば「yyyyy@group.calendar.google.com」
に登録する方法を考えました。
上のコードの後半を次のように書き換えます。

    if(added == "") {
      if(mylocation=="会議室1"){
        id="xxxxx@group.calendar.google.com";
      }else if(mylocation=="会議室2"){
        id="yyyyy@group.calendar.google.com";
      }
      thisevent = CalendarApp.getCalendarById(id)
        .createEvent(myevent, mystart, myend, {
          location: mylocation
        });
      sheet.getRange(i, 5).setValue("追加済み");
    }

実際には該当しない場所が指定された場合は後続をスキップしたりデフォルトカレンダーに登録したりするなどの処理が必要かもしれません。

関連記事

[ 2015年5月14日 | カテゴリー: JavaScript | タグ: , ]

« | »

コメント

  1. keane234 より:

    記事大変参考になりました。
    コードは上手く機能しましたが、まだ重複してしまいます。
    コードは前回のインポートのコードの後に、今回のコードを貼り付ければよろしいでしょうか? または、このコードのみでよろしいでしょうか?

  2. stabucky より:

    >keane234さん
    今回のコードのみでOKです。
    前回のコードは削除してください。

  3. 藤田 より:

    スプレッドシートとGカレンダーとの同期を実現させるスクリプト、大変便利に使える予感があります。
    ご教授ありがとうございます。

    さて今回のスクリプト加えて
    もうひとつできればいいなと思っていることがあります。

    mystartの日時だけを送信すると、
    自動的に一律1時間なり2時間なりを
    Gカレンダーに反映させることはできないでしょうか?

    よろしくお願いします。

  4. stabucky より:

    >藤田さん
    次のように書き換えるとmyendにmystartの2時間後がセットされます。
    myend = new Date(mystart.getTime() + 2 * 60 * 60 * 1000);
    試してみてください。

  5. […] 「GoogleスプレッドシートからGoogleカレンダーにインポート」を書いたのですが、今回、こんな質問をいただきました。 「開始時刻を設定し、終了時刻は自動的にその1時間後にする方法はないか」 そこでGoogle Apps Scriptで日時がどのように扱われているか、調べてみました。 […]

  6. 藤田 より:

    ありがとうございました。
    うまく作動いたしました。

    ところで2時間後のセットを1時間30分後などとする時には
    どこに変更を加えればいいですか?

    すみませんよろしくお願いします。

  7. 藤田 より:

    1時間30分の場合
    myend = new Date(mystart.getTime() + 1.5 * 60 * 60 * 1000);
    として試してみたら、一応カレンダーに反映しましたが
    問題ないでしょうか?

    よろしくお願いします。

  8. stabucky より:

    >藤田さん
    ご認識のとおりです。
    スクリプトはミリ秒(1000分の1秒)という単位で時間を管理しています。
    詳細については次のページを確認ください。
    http://stabucky.com/wp/archives/7442

  9. netz より:

    こちら、いつも便利に使わせていただいております。
    googleフォームから記入し追加して自動的にカレンダーに登録される仕組みですが
    どうしても自動で登録されてくれません。
    1行上の「追加済み」を削除すると自動的にすべて登録してくれるのですが、、、

    現状はこれを社内で「つまり」と呼んで、定期的につまりを取ってます。w
    つまりを解消する方法はございますか?

  10. stabucky より:

    >netzさん
    1.GoogleフォームからGoogleスプレッドシートにイベントを保存。
    2.GoogleスプレッドシートのイベントをまとめてGoogleカレンダーに登録。
    という流れでしょうか。
    もしこの流れならば1.の段階でイベントを保存する際の処理がずれているように思えます。
    もし一件ずつ登録するのであればGoogleフォームからGoogleカレンダーに直に登録する方法があるようです。
    「GoogleフォームからGoogleカレンダー」で検索するといくつかヒットします。
    私自身は直に登録する方法は試したことがありません。
    お役に立てず申し訳ありません。
    その後の状況等を教えていただけると幸いです。

  11. 藤田 より:

    教えていただいた、フォームからカレンダーへの連携スクリプト
    大変重宝させて頂いております。

    さて、このスクリプトで幾つかのカレンダーに振り分けることは可能でしょうか?
    弊社には会議室が3箇所ほどありまして、
    フォームのラジオボタンで
    会議室1
    会議室2
    会議室3
    を選んでフォーム送信するとそれぞれのカレンダーに登録されるようになれば
    更に便利に使えるのではと考えています。
    そのような機能を教えていただいたスクリプトに追加できますでしょうか?

    よろしくお願いします。

  12. stabucky より:

    >藤田さん
    「フォーム」というのはアンケートを作ったりできるGoogleフォームでしょうか。
    興味はあるのですがまだ使ったことがありません。
    会議室毎にカレンダーがあるのでしょうか。となればカレンダー毎にIDがあるので振り分けることは可能です。
    http://stabucky.com/wp/archives/5532

  13. 藤田 より:

    「フォーム」はGフォームのことです。
    Gフォームは送信された予約内容などをGスプレッドシートに自動的に記録されるようになっています。
    流れとしては、以下のようになります。
    Gフォームに入力→Gスプレッドシートに自動記録→Gカレンダーに自動登録

    多人数の会議場予約を可能にしたいので、
    スタッフ各人が出先のスマホなどからも予約できればいいなと思って
    ご相談させていただきました。

    http://stabucky.com/wp/archives/5532も見させていただきました。
    ありがとうございます。
    「CalendarApp.getDefaultCalendar()」の部分を
    「CalendarApp.getCalendarById(“xxxxx@group.calendar.google.com”)に変更
    とのことですが
    Gフォームで選択された3つの会議場を振り分けるには
    どうなるでしょうか?

    Gフォームで選択された3つの会議場は
    Gスプレッドシートの特定のセルに「会議室1」「会議室2」「会議室3」のいずれかが
    入力されるものとします。

    よろしくお願いします。

  14. 藤田 より:

    訂正します。

    Gフォームで選択された3つの会議場は
    Gスプレッドシートの特定のセルに「会議室1」「会議室2」「会議室3」のいずれかが
    入力されるものとします。

    上記の文章中、「特定のセル」ではなく「特定の列」でした。

  15. stabucky より:

    >藤田さん
    カレンダーの振り分けについて追記しました。
    Locationに会議室がセットされるという前提です。適宜、修正してください。

  16. 藤田 より:

    追記ありがとうございます。

    テストいたしまして、希望通りの結果となりました。
    大変助かります。
    ありがとうございました。

  17. stabucky より:

    >藤田さん
    上手くいったようで安心です。
    今回、Googleフォームについても試してみました。面白い仕組みですね。
    また何かあれば教えてください。

  18. moke より:

    >stabucky様
    記事を参考にさせていただいております。ありがとうございます。
    下記、質問させて頂いてもよろしいでしょうか?

    1)イベントタイトルに、/や:を用いて複数項目(複数セル)を登録させることは可能でしょうか?
    2)createAllDayEvent を用いて終日イベントを登録するようにしているのですが、
      END Date が入力した日付より1日前で登録されてしまいます。
      回避方法はありますでしょうか?

    ご教授いただければ幸いです。
    何卒よろしくお願いいたします。

  19. stabucky より:

    >mokeさん
    (1)
    シートの予定を「イベントA/イベントB」として、イベントAとイベントBの両方をカレンダーにセットするということでしょうか。
    可能ですが難しいです。「/」を使って予定を二つに分割することは可能です(splitで分割して配列にする)。これをループさせてそれぞれをセットします。これが面倒だと思います。
    シートの予定を「イベントA」と「イベントB」として同じ日ならば「イベントA/イベントB」としてカレンダーにセットするということであれば、さらに難しいです。
    (2)
    そのような仕様になっているようです。
    公式サイト
    https://developers.google.com/apps-script/reference/calendar/calendar#createAllDayEvent(String,Date,Date)

    「August 15th to 17th」をセットする場合、
    開始日「August 15, 1969」
    終了日「August 18, 1969」
    とする例が挙げられています。
    仕様なのでどうしようもない気がします。

  20. moke より:

    stabucky 様
    ご返信ありがとうございます!
    (1)は下記のように、イベントの補足情報を、説明欄ではなく
       イベントタイトルに組み込みたいという感じです。
       例)〇〇小学校運動会/佐藤

    (2)なるほど了解いたしました。
       スクリプト上で、”+1日”というようなことができればと思ったのですが
       難しいですね。。

  21. stabucky より:

    >mokeさん
    (1)
    上の例でF列に例えば「Note」という列を作ります。
    コードを次のように書き換えます。
    added = sheet.getRange(i, 5).getValue();
    mynote = sheet.getRange(i, 6)
    .getValue();
    if(added == “”) {
    thisevent = CalendarApp.getDefaultCalendar()
    .createEvent(myevent+”/”+mynote, mystart, myend, {
    location: mylocation
    });
    sheet.getRange(i, 5).setValue(“追加済み”);
    }
    }
    A列に「〇〇小学校運動会」、F列に「佐藤」として実行すると「〇〇小学校運動会/佐藤」とセットされます。
    (2)
    コードを次のように書き換えると日付が翌日になります。24時間後という意味です。
    myend = sheet.getRange(i, 3).getValue();
    myend = new Date(myend.getTime() + 24 * 60 * 60 * 1000);

  22. moke より:

    >stabucky様
    ありがとうございます!!!!!
    無事に動きました!
    プログラミング(と言っていいのでしょうか?)自体、ド素人でしたが
    こちらのサイトたどり着き、何とか思っていたものが出来上がりました。
    助かりました。ありがとうございました!!!

  23. stabucky より:

    意図通り動作したようで安心しました。

  24. kei より:

    こんにちは 非常に参考にさせていただきました。
    ご相談をさせて頂きたいのですが、一度同期をしてGCalendarに追加した後に、時間やタイトルをスプレットシート上で修正した際に既に加わっているCalendar上の予定も自動で修正されるようには出来ないでしょうか?

  25. stabucky より:

    keiさん
    厳密に言えば同期ではないので、修正はできないです。追加になってしまいます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報