質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3896閲覧

GAS 複数要素をもとに検索し列番号を出すには

nezumimuzen

総合スコア19

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/22 02:30

編集2020/07/22 10:16

現在GASを使い、
Googleフォームで日付や電話番号・お名前入力
→スプレッドシート
→スプレッドシートの情報をGoogleカレンダーへ予定を入れる
上記を動かし予約カレンダーとして利用しているのですが、予約のキャンセルがあったときもフォーム入力で自動で予定の削除ができないかと方法を考えております。

現在考えている方法としまして下記の「キャンセル」のシートにフォーム送信があった際、シート「予約」から予約日と電話番号の二つの条件で検索し、行番号をindexOfなどで抽出をしたら列番号と行番号で対象のイベントIDの値を取り、deleteCalendar()で予定を削除しようと考えております(処理後C列に「済」を記帳)

しかしindexOfでは二つの条件で検索ができず、他に方法も思い浮かばないためこの度質問させていただきました。

また、処理を行う際に「予約」のB列とC列を合わせたものと「キャンセル」のA列とB列を合わせたものでindexOfを動かせないかと下記のコードを入力しましたが期待していた動作はされませんでした。
for文の書き方が合っているか、また動作しない理由もぜひ教えてください。

var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var mySheet = objSpreadsheet.getSheetByName("予約");  var dat = mySheet.getDataRange().getValues(); //シートデータを取得 var mySheet2 = objSpreadsheet.getSheetByName("キャンセル");  var dat2 = mySheet2.getDataRange().getValues(); //シートデータを取得 for(var i=1,j =1; i<dat.length, j<dat2.length; i++ ,j++){ var yoyaku = dat[i][1]+dat[i][2] var cancel = dat2[j][0]+dat2[j][1] var search = yoyaku.indexOf(cancel); }

GASに触れてからまだ日が浅く、説明が不明瞭なところもあるかと存じますが、質問やコメントをいただけましたら回答いたします。
何卒お教え願います。

予約
|名前|電話番号|予約日|イベントID
|:--|:--:|--:|
|aaa|09000000000|2020/7/25|xxxxxxxxxx
|bbb|08000000000|2020/7/25|yyyyyyyyyy

キャンセル

電話番号予約日反映 
090000000002020/7/25

追記

下記コードを使ってスプレッドシートよりGoogleカレンダーへ予定の書き出しをしているのですが(もとコードから書き換えがあるため書き間違えがある可能性あり)、このコードで出力されるイベントIDというのが「zzzzzzzzzzzzzzzz@google.com」というような形で出力されます。
しかし今回行いたいカレンダーの削除において必要なイベントIDとは文字列が異なるため正しいイベントIDの書き出し方を教えていただきたく存じます。

javascript

1function addTaskEvents() { 2 3var cal = CalendarApp.getCalendarById('xxxxxxxxxxxxxxxxx@group.calendar.google.com'); //カレンダーIDでカレンダーを取得 4 5var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 6 var mySheet = objSpreadsheet.getSheetByName("予約");  7 var dat = mySheet.getDataRange().getValues(); //シートデータを取得 8 9for(var i=1;i<dat.length;i++){ 10 if(dat[i][3] == ""){ 11 12/* 日時をセット */ 13 var evtDate = new Date(dat[i][2]); 14 var evTime = "18:00" 15 var Name =dat[i][0] 16 var option =dat[i][1] 17 18var myEvt = cal.createEvent(Name , evtDate , evtTime , option); 19} 20 21dat[i][3]= myEvt.getID();//イベントIDを入力 22} 23mySheet.getRange(1,1,i,3).setValues(dat); 24} 25

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/07/22 03:00

for(var i=1,j =1; i<dat.length, j<dat2.length; i++ ,j++){  上記のforループは、どのように動作するのでしょうか? ループ変数 i で回す外側のループ(予約)と、ループ変数jで回す内側のループ(キャンセル)の2重ループにしないと駄目なように思います。 また、変数yoyakuとcancelに文字列("090000000002020/7/25"など)を代入していますが、その後に参照されていません。「yoyakuとcancelが一致したら、予約を取り消す」という部分が抜けていませんか? yoyaku.indexOf(cancel); という部分ですが、そこを実行する時のyoyakuは文字列です(dat[i][1]+dat[i][2]が代入されていますから)。文字列にindexOfメソッドはありません。indexOfの使い方を確認されることをお勧めします。
nezumimuzen

2020/07/22 09:53

coco_bauer様 コメントありがとうございます。 for文の概念をしっかり理解していなかったことと、シート2つのループ変数を実行するためネットなどで情報を調べて見様見真似で打ち込んだものだったため理屈を無視して書いておりました。 丁寧な解説ありがとうございます。 また。indexOfに文字列メゾットがないことを認識していませんでした。 引き続きjava scriptについての勉強をさせていただきます。
guest

回答1

0

ベストアンサー

外側のループをキャンセルで回して、内側のループで予約の中から探す。
日付は文字列化して比較する。

GAS

1function myFunction() { 2 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 var mySheet = objSpreadsheet.getSheetByName("予約");  4 var dat = mySheet.getDataRange().getValues(); //シートデータを取得 5 var mySheet2 = objSpreadsheet.getSheetByName("キャンセル");  6 var dat2 = mySheet2.getDataRange().getValues(); //シートデータを取得 7 8 for(var i = 1; i < dat2.length; i++) { 9 var cancel_number = dat2[i][0]; 10 var cancel_date = Utilities.formatDate(dat2[i][1], 'Asia/Tokyo', 'yyyy-MM-dd'); 11 12 for (var j = 1; j < dat.length; j++) { 13 var yoyaku_number = dat[j][1]; 14 var yoyaku_date = Utilities.formatDate(dat[j][2], 'Asia/Tokyo', 'yyyy-MM-dd'); 15 16 if (cancel_number === yoyaku_number && cancel_date === yoyaku_date) { 17 var event_id = dat[j][3]; 18 19 // なにかevent_idを使った処理をする 20 console.log("event_id: " + event_id); 21 22 mySheet2.getRange(i + 1, 3).setValue("済"); 23 } 24 } 25 } 26}

投稿2020/07/22 03:27

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nezumimuzen

2020/07/22 10:17

Daregada様 回答ありがとうございます! ご記入いただきましたコードで思っていた動作ができました! しかし、イベントIDについて改めて調べたところシート「予約」に記帳されていたイベントIDがあっていないのとわかりました。 追記にてシート予約で行っているGASのコードを入力したため添削いただけましたら幸いです。
Daregada

2020/07/22 11:24 編集

いや、今回の質問はこれで解決でしょう。複数の情報に基づいて該当するイベントID(ここでは内容は問わない)を見つけ、処理が可能な状態にしていますよね。 追記の内容は、「Googleカレンダーの削除に必要なイベントIDをGASで得る方法」みたいな質問を新たに作って、そちらでやってください。延々とひとつの質問の内容を変えつつ解決させないのは筋が悪いです。
nezumimuzen

2020/07/22 11:59

Daregada様 ご指摘いただいた通り、筋違いな軽率な対応をしてしまい誠に申し訳ございません。 改めて質問をいたしますため、よろしければご回答いただけましたらと存じます。 この度は、御気分を害されたかと思います。 大変申し訳ありませんでした。 ご容赦いただけますようお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問