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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

JavaScript

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

Q&A

解決済

2回答

2055閲覧

Google Apps Scriptで発生したspliceメソッドのエラーの解消方法

yuuoru

総合スコア8

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/22 01:31

GASの初心者ですがよろしくお願いします。

グーグルカレンダーから予定を取得し、JSONデータにするというものを書いていたのですが、カレンダーのタイトルから()で囲まれた文字列を消したいのでspliceを使ったところ、TypeError: オブジェクト (名前)予定 で関数 splice が見つかりません。
というエラーが出ました。

ちなみに「(名前)予定」はテスト用にカレンダーに入れた予定のタイトルで、今回は「(名前)」の部分を消そうとしています。

GASもspliceもあまり使ったことがなく、調べつつ使ってみたもののどの書き方が悪いのか等全くわからず詰まってしまいました。どなたかご教授いただけると嬉しいです。
よろしくお願いします。

.
以下コードになります。

function doGet(e) { // クエリパラメーター「name」で指定された、Googleカレンダー取得対象のユーザーの名前を取得する。 //var name = e.parameter.name; // 現時点のDateを生成する var nowDate = new Date(); // 今日の日付の00:00:00時点のDateを生成する var startDate = new Date(nowDate); startDate.setHours(0); startDate.setMinutes(0); startDate.setSeconds(0); // 今日の日付の23:59:59時点のDateを生成する var endDate=new Date(startDate); endDate.setHours(23); endDate.setMinutes(59); endDate.setSeconds(59); // 指定したユーザーのGoogleカレンダーの予定を取得する。 var cal = CalendarApp.getCalendarById('gmailアドレス'); // 今日一日のGoogleカレンダーの予定を取得する var myEvents=cal.getEvents(startDate,endDate); // 今日一日のGoogleカレンダーのJSONを生成する。 var body = ''; num = 0; var result = []; var fullTitle = ''; var evtTitle = ''; //予定が現在時刻に重なっている //タイトルに名前が含まれている //以上の場合にJSONに追加 for each(var evt in myEvents){ fullTitle = evt.getTitle(); var start = fullTitle.indexOf('('); var end = fullTitle.indexOf(')'); end = end - start; if(start != -1 && end != -1){ evtTitle = fullTitle.splice(start, end); } if(Moment.moment(evt.getStartTime()).isBefore(nowDate.getTime()) && Moment.moment(evt.getEndTime()).isAfter(nowDate.getTime())){ result[num] = { start: convertDate(evt.getStartTime()), end: convertDate(evt.getEndTime()), title: evt.getTitle() } num++; } } return ContentService .createTextOutput(JSON.stringify(result)) .setMimeType(ContentService.MimeType.JSON); } function convertDate(date) { //moment.jsで日付の形式を合わせる(上記コメントアウトとやってることは一緒。便利) return Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm:ss'); } function toDoubleDigits(num) { num += ""; if (num.length === 1) { num = "0" + num; } return num; }

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

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

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

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

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

guest

回答2

0

javascript

1evtTitle = evt.getTitle().replace(/正規表現/,'');

ということでしょうかね。

上記なら1文で、以下に相当します。

JavaScript

1/*省略*/ 2 fullTitle = evt.getTitle(); 3 var start = fullTitle.indexOf('('); 4 var end = fullTitle.indexOf(')'); 5 6 end = end - start; 7 8 if(start != -1 && end != -1){ 9 evtTitle = fullTitle.splice(start, end); 10 } 11/*省略*/

あと、Lhankor_Mhyさんご指摘の補足になりますが、こちらによれば、for each...in文はオブジェクト対象であることと現状上廃止されていますので使用すべきではありません。
せめてfor...in文にしましょう。ただし、この場合、順不同となります。

[参考]

[追記]
エラーの原因はpapinianusさんが回答されていますので省略しました。

投稿2018/05/22 09:20

編集2018/05/22 13:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

papinianus

2018/05/22 12:33

evtTitle = evt.getTitle().replace(/(.*?)/,"");
退会済みユーザー

退会済みユーザー

2018/05/22 13:00

> papinianusさん 補足ありがとうございます。
yuuoru

2018/05/22 22:31

stshishoさん、papinianusさん、ありがとうございます! そういう書き方が出来たんですね……納得しました! こちらに寄せられていた質問への回答までありがとうございます。for each文の件知りませんでした。ありがとうございます!!その方法でトライしてみます!
guest

0

ベストアンサー

spliceは配列を操作するもの。一方「(名前)予定」は文字列です。

substring()を使ってみてはいかがでしょうか。

--追記
substringをすると「(名前)」が取れるとのことですが、それが取れたらほぼ答えではないでしょうか?

想定するやり方は

  1. 削除する部分を抜き出して、空文字にreplaceする
  2. 区切り文字から必要な部分を判定して、それ以外のところをsubstringする

いずれでも可能かと思います

必要箇所を下記に抜粋します

javascript

1 var start = fullTitle.indexOf('('); 2 var end = fullTitle.indexOf(')') + 1; 3 4// end = end - start + 1; //substringをするなら、こういう操作は不要 5 6 if(start != -1 && end != -1){ 7 var name = fullTitle.substring(start, end); 8 var eventTitle = fullTitle.replace(name, ""); 9 } 10 if(start != -1 && end != -1){ 11 var eventTitle = (start == 0)? fullTitle.substring(end) : fullTitle.substring(0, start); 12 }

投稿2018/05/22 01:43

編集2018/05/22 12:29
papinianus

総合スコア12705

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

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

yuuoru

2018/05/22 08:09

回答ありがとうございます!spliceは配列なんですね…。 質問の仕方が悪かった、もしくは回答への理解が足りてなかったらすみません。今回は「(名前)予定」や「予定(名前)」を「予定」になるようにしたいのですが、substringだと指定の範囲が抜き出されて「(名前)」になってしまうのでは、と思ったのですが、どうでしょうか。 もし間違っていたらすみません。
papinianus

2018/05/22 12:32

substingを使って解決する方法を追記しました。
yuuoru

2018/05/22 22:34

追加ありがとうございます。 丁寧にご説明して頂きとても助かりました。 お二方に助けて頂きましたが、最初に疑問に対してお答えを頂けたのでこちらベストアンサーに選ばせて頂きました。ありがとうございます!!
退会済みユーザー

退会済みユーザー

2018/05/22 23:49

何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問