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

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

ただいまの
回答率

87.89%

GOOGLEスプレットシートとカレンダー連携でセルに入力された関数を文字列として認識させたい

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 5,696

score 8

前提・実現したいこと

ここに質問したいことを詳細に書いてくださいイメージ説明

前提・実現したいこと

Googleスプレットシートでプルダウンで投入した表記した
関数を数値文字として認識させGoogleカレンダーへ反映させたい。

■例
※ 開始時間

関数
=concatenate(J22&K22&L22&M22&N22&O22)

上記はプルダウンでJ列以降で選択している。
(タブレットでの手入力が面倒だと要望の元)

表示文字
2016/08/24 17:59

処理は同様だと思うが
終了時間と説明部も同様に処理したい。

発生している問題・エラーメッセージ

エラーメッセージ

メソッド createEvent(string,string,string,object) が見つかりません。

該当のソースコード

GOOGLE スクリプト

//
//ver.1.0.0

//予定を作成する関数
function CreateSchedule() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var slist = ss.getSheetByName('スケジュール');
var clist = ss.getSheetByName('カレンダー一覧');
var lastrow = slist.getLastRow();

//予定の一覧・カレンダー名の一覧・カレンダーIDの一覧を取得
var contents = slist.getRange(2, 1, lastrow, 8).getValues();
var cnlist = clist.getRange(1, 1, clist.getLastRow(), 1).getValues();
var cidlist = clist.getRange(1, 2, clist.getLastRow(), 1).getValues();

//順に予定を作成
for(i = 0; i <= lastrow - 2; i++) {

//「完(作成完了)」になっていたら、飛ばす(途中でエラーが出て再度この関数を実行した時に、作成済みの予定が重複して作成されるのを防ぐため)
if(contents[i][0] == '完') {

//「終日」が空白(つまり、終日予定でない)の場合は、「開始日時」・「終了日時」を設定して予定を作成
}else if(contents[i][4] == ''){

//選択されたカレンダーのIDを取得
for(j = 0; j <= cnlist.length; j++) {
if(contents[i][1] == cnlist[j][0]) {
var calendar = cidlist[j][0];
break;
}
}
//予定のコンテンツを取得
var title = contents[i][2];
var startTime = contents[i][5];
var endTime = contents[i][6];
var description = contents[i][3];
var location = contents[i][7];

//予定を作成
CalendarApp.getCalendarById(calendar).createEvent(
title,
startTime,
endTime,
{description: description,
location: location}
);

//「終日」が空白でない(つまり、終日予定)の場合は、日付を設定して予定を作成
}else{

//選択されたカレンダーのIDを取得
for(j = 0; j <= cnlist.length; j++) {
if(contents[i][1] == cnlist[j][0]) {
var calendar = cidlist[j][0];
break;
}
}
//予定のコンテンツを取得
var title = contents[i][2];
var date = contents[i][4];
var description = contents[i][3];
var location = contents[i][7];

//予定を作成
CalendarApp.getCalendarById(calendar).createAllDayEvent(
title,
date,
{description: description,
location: location}
);
}

//無事に予定が作成されたら「完」にする
slist.getRange(i + 2, 1).setValue('完');

//次
}
}

//シート「スケジュール」を初期化する関数
function ResetSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('スケジュール');
sheet.getRange(2, 1, sheet.getLastRow() + 1, sheet.getLastColumn()).clearContent();
}

//スプレッドシートが開かれたら自動的に実行される関数
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();

//スプレッドシートのメニューにカスタムメニュー「自動処理」を作成(他の関数を実行するメニューを作成)
var subMenus = [];
subMenus.push({name: 'カレンダー一覧取得', functionName: 'onOpen'});
subMenus.push({name: '作成', functionName: 'CreateSchedule'});
subMenus.push({name: 'リセット', functionName: 'ResetSheet'});

ss.addMenu('自動処理', subMenus);

//関数「GetCalendarList()」と同じ(カレンダー一覧は毎回読み込まないといけないので、ここでも実行)
var clist = ss.getSheetByName('カレンダー一覧');

//削除されたカレンダーが残らないように、一度カレンダーの一覧を削除
clist.getRange(1, 1, clist.getLastRow() + 1, 2).clearContent();

//一覧が白紙になった上で、再度最新のカレンダー一覧を取得、作成
var calendars = CalendarApp.getAllCalendars();
var range = clist.getRange(1, 1, calendars.length + 1, 2);

for(i = 0; i <= calendars.length - 1; i++) {
range.getCell(i + 1, 1).setValue(calendars[i].getName());
range.getCell(i + 1, 2).setValue(calendars[i].getId());
}
}

function test() {
}

前提・実現したいこと

ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。  
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ここにご自身が実行したソースコードを書いてください

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/08/23 13:28

    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。また、参考にされている記事などがありましたらURLを追記されたほうが回答が付きやすいと思います。

    キャンセル

回答 1

+1

メソッド createEvent(string,string,string,object) が見つかりません。

ですが、createEventの引数の型は

createEvent( string, date, date, object )

です.
Google Apps ScriptのCalendarAppのドキュメントを下に添えておきますので、お読みください。
https://developers.google.com/apps-script/reference/calendar/calendar-app

蛇足ですが、私ならconcatenateの代わりに

var sheet /*シートを取得してください*/ ;
var year = sheet.getRange(row,colummn).getValue();
/*以下、yearと同じ方法なので割愛*/
var month;
var day;
var hour;
var minutes;

var date 
  =new Date(
     year,
     month,
     day [,
        hour, minute
     ] 
   ) ;

sheet.getRange(row,column).setValue(date);


を使います。

これなら、セルのデータとってきて、calendarAppでそのままセットできますし。
まぁ、セルのデータはあくまでstringで、カレンダーに入力する直前に new Date でインスタンス化してもらってもOKです。

ちなみに、コードはインデントしていただけると助かります。
(大変失礼ながら、MOMOTA555様のコードは読むのを途中でやめちゃいました・・・。)

参考までに、私が過去書いたものを載せます。
終了時刻は、開始時刻の15分後で設定しています。

//eventName     :string 
//eventStartDate:date
//description   :string
//guestAddress  :string
CalendarApp
  .getCalendarById("自分のメールアドレス")
  .createEvent(
    eventName,
    startEventDate,
    new Date(
    startEventDate.setMinutes(
        startEventDate.getMinutes()+15 
      )
    ),//終了時刻は、15分後
  {  
     description:sentence,
     guests:guestAddress
  }

だいぶ説明を省略しているので、なにかご質問があればお手数ですがお願いします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.89%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る