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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

2回答

1010閲覧

GASにて。googleカレンダー→gmail→スプレッドシート転記時に特定の文字列を削除したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

0クリップ

投稿2020/02/21 01:35

編集2020/02/21 03:55

googleカレンダーに登録→gmailに通知→スプレッドシートにて一覧表示させるスクリプトを作成中なのですが、
googleカレンダーからの通知の最後に必ずついてくる下記の文章を削除した上でスプレッドシートに記載させたいと考えております。
何かいい方法をお教えいただけないでしょうか。

↓削除したい文言

「Google カレンダーからの招待状: https://www.google.com/calendar/

「***(カレンダー名)」カレンダーの招待 - 更新の受信が設定されているため、本メール
sample@email.com にお送りしています。

これらのメールを受けとらないようにするには、
https://www.google.com/calendar/ にログインしてカレンダーの通知設定を変更し
てください。

この招待状を転送すると、転送先のユーザーも、主催者に出欠の返答を送信してゲス
トリストに追加してもらったり、自分の招待ステータスに関係なく他のユーザーを招
待したり、あなたの出欠確認の返答を変更したりできるようになります。詳しくは、
https://support.google.com/calendar/answer/37135#forwarding をご覧ください」

#ソースコード
※スクリプト作成についてはhttps://tonari-it.com/gas-gmail-spreadsheet/サイトさんを参考にさせていただきました。

var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('***(シート名)'); function ****(function名①)() { /* Gmailから特定条件のスレッドを検索しメールを取り出す */ var strTerms = 'label:***(ラベル名)';//検索文字列 var myThreads = GmailApp.search(strTerms,0,30); var myMsgs = GmailApp.getMessagesForThreads(myThreads);//二次元配列 var valMsgs = []; /* 各メールから日時、送信元、件名、内容を取り出す */ for(var i=0;i<myMsgs.length;i++){   for(var j=0;j<myMsgs[i].length;j++){    var msid = myMsgs[i][j].getId();//メッセージIDを取得    //もしメッセージIDがスプレッドシートに存在しなければ    if(!hasId(msid)){     var date = myMsgs[i][j].getDate();     var from = myMsgs[i][j].getFrom();     var subj = myMsgs[i][j].getSubject(); var body = myMsgs[i][j].getPlainBody();     var perm = myThreads[i].getPermalink(); var value2 = myMsgs[i][j].getPlainBody();          valMsgs.push([date,from,subj,body,msid,perm,value2]);    }   }  } /*hangoutbotに通知*/  if(valMsgs.length>0){//新規メールがある場合、botに通知する //botのURLを入れる var url = "***(URL)"; var text = value2; var payload = { "text" : text } var json = JSON.stringify(payload); //エンコード var options = { "method" : "POST", "contentType" : 'application/json; charset=utf-8', "payload" : json } var response = UrlFetchApp.fetch(url, options); }  /* スプレッドシートに出力 */  if(valMsgs.length>0){//新規メールがある場合、末尾に追加する   var lastRow = mySheet.getDataRange().getLastRow();   mySheet.getRange(lastRow+1, 1, valMsgs.length, 7).setValues(valMsgs);  } } function hasId(id){ var data = mySheet.getRange(1, 5, mySheet.getLastRow(),1).getValues();//E列(メッセージID)を検索範囲とする var hasId = data.some(function(value,index,data){//コールバック関数 return (value[0] === id); }); return hasId; }

#スクリプトを実行すると
上記スクリプトを実行して得られる情報は下記の感じです。
この情報がD列とG列に記載されます。

この予定は変更されました。

タイトル: ******
(詳細に記載の情報が複数行ある)
日時: ******
場所: ******,
カレンダー: *****
参加者:
* *****- 作成者

予定の詳細:
https://www.google.com/calendar/event?action=VIEW&eid=*****(カレンダーへのリンク)

Google カレンダーからの招待状: https://www.google.com/calendar/

「***(カレンダー名)」カレンダーの招待 - 更新の受信が設定されているため、本メール
sample@email.com にお送りしています。

これらのメールを受けとらないようにするには、
https://www.google.com/calendar/ にログインしてカレンダーの通知設定を変更し
てください。

この招待状を転送すると、転送先のユーザーも、主催者に出欠の返答を送信してゲス
トリストに追加してもらったり、自分の招待ステータスに関係なく他のユーザーを招
待したり、あなたの出欠確認の返答を変更したりできるようになります。詳しくは、
https://support.google.com/calendar/answer/37135#forwarding をご覧ください

#試したこと:matchメソッド
変更したい getPlainBody()の後にmatchメソッドを置いて残したい最後の「作成者」を指定しましたが、改行があるため除外されたのか…?全文を残すことができませんでした。

↓変更したコード

/* 各メールから日時、送信元、件名、内容を取り出す */ for(var i=0;i<myMsgs.length;i++){   for(var j=0;j<myMsgs[i].length;j++){    var msid = myMsgs[i][j].getId();//メッセージIDを取得    //もしメッセージIDがスプレッドシートに存在しなければ    if(!hasId(msid)){     var date = myMsgs[i][j].getDate();     var from = myMsgs[i][j].getFrom();     var subj = myMsgs[i][j].getSubject(); var body = myMsgs[i][j].getPlainBody().match(/.*作成者/);     var perm = myThreads[i].getPermalink(); var value2 = myMsgs[i][j].getPlainBody();          valMsgs.push([date,from,subj,body,msid,perm,value2]);    }   }  }

↓得られた結果
D列が下記の作成者のみになりました。(改行があるためそこで切られてしまうのでしょうか)

* *****- 作成者

どうぞよろしくお願いいたします。

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

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

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

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

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

t_obara

2020/02/21 03:37

参考にされたソースについて、どこまで理解していますか? 理解できていないので、修正方法を具体的に教えて欲しいということなのでしょうか?
退会済みユーザー

退会済みユーザー

2020/02/21 03:52

ご返信ありがとうございます。理解できていないので修正方法を具体的に教えてください。よろしくお願いします。
guest

回答2

0

気付いていなかったのですが、スプレッドシートはイベント更新のイベントトリガーに対応していました。

なんで、こちらを参考に CalendarAPI を有効して、下記のようなコードをすれば、メールを介在させずにイベントをシートに書き込めます。

javascript

1const onEventUpdated = (e) => { 2 const calendarId = e.calendarId; 3 const nextToken = PropertiesService.getScriptProperties().getProperty(calendarId); 4 if(!nextToken) return; 5 const res = Calendar.Events.list(calendarId, {"syncToken":nextToken}); 6 PropertiesService.getScriptProperties().setProperty(calendarId, res.nextSyncToken); 7 res.items.forEach(eventParser); 8} 9const eventParser = (e) => { 10 if(e.status === "cancelled") return; 11 const event = CalendarApp.getEventById(e.id); 12 SpreadsheetApp.getActive().getSheetByName("シート1").appendRow(eventToArray(event)); 13} 14const eventToArray = (event) => [event.getTitle(), event.getStartTime(), event.getEndTime(), event.getDescription(), event.getLocation()]; 15 16const initializer = () => { 17 const calendarId = "___@gmail.com"; 18 PropertiesService.getScriptProperties().setProperty(calendarId, Calendar.Events.list(calendarId).nextSyncToken); 19}

まあやんないでしょうが、使い方としてはinitializerにメールアドレスを正しく書いて、実行。
で onEventUpdated をトリガーに登録。
シート1にイベントが書き込みされるので、eventToArrayを必要なデータを取得できるよう修正すればよいと思います。

投稿2020/02/21 14:09

編集2020/02/21 14:12
papinianus

総合スコア12705

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

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

0

q242642 のような関数をかいて、下記のように使えばいいのではないかと思います。

javascript

1var body = q242642(myMsgs[i][j].getPlainBody()); 2 3const q242642 = (text) => { 4 const pos = text.split("\n").reduce((a,c,i)=> a!==-1 ? a : (c.indexOf("Google カレンダーからの招待状: https://www.google.com/calendar/") > -1 ? i : -1),-1); 5 return text.split("\n").slice(0,pos).join("\n"); 6}

投稿2020/02/21 14:23

papinianus

総合スコア12705

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

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

papinianus

2020/02/21 14:25

コードがうまく動かない、は、その参考サイトの作者に聞きましょう。質問者さまのためならともかく、その人の記事のための改善活動をするのはおかしな話だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問