前提・実現したいこと
スプレッドシート「カレンダー転記用」シートの内容を配列データとして取得。
取得したデータを元にGoogleカレンダーに終日予定として登録がしたいです。
createAllDayEvent(予定件名,日付)で登録予定。
取得するデータは以下5種と
a)日付データ:B列 配列
b)拠点1予定:D列データ
c)拠点2予定:E列データ
d)拠点3予定:F列データ
e)拠点4予定:G列データ
createAllDayEventの処理対象とするか否かの判定用として、(continueでスキップのつもり)
すでに予定登録済か否かのフラグ4種
f) b)の登録済フラグ:H列
g) c)の登録済フラグ:I列
h) d)の登録済フラグ:J列
i) d)の登録済フラグ:K列
それぞれを別個の配列としてデータ取得の想定。
配列データの取得がうまくできていないようで下のエラーが立ちます。
ネットや本を見たのですが、どこがマズイのか、どう直せばよいのかが分かりません。
(例)
・配列の指定に誤りがありますか?
・myDate配列に入れるデータを targetDateで指定しているする部分が違う??
>>そもそも、こんな指定は不要??
・行、列Indexの指定後に、getValuesで値取得して、各配列に投入する処理の記述が必要??
・配列でデータが取得できているかの確認のconsole.logの指定が違う???
★前回質問で配列についてレクチャーいただき、ちょっとだけ理解したつもり
でしたが、残念ながらまだ理解がふやふやのようです
があやふやのようです。。。 (https://teratail.com/questions/361425 の次の工程)
発生している問題・エラーメッセージ
<エラー>
Exception: Invalid argument: title
createEvent @ <処理2-1>転記シート→カレンダー登録.gs:76
該当のソースコード
以下、全文記載します。
function createEvent() {
//▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
const ss = SpreadsheetApp.getActiveSpreadsheet();
const mysheet1 = ss.getSheetByName("カレンダー転記用");
constc al = CalendarApp.getCalendarById(calId);
//▼データ取得範囲の指定
const lastRow = mysheet1.getDataRange().getLastRow();
const lastCol = mysheet1.getDataRange().getLastColumn();
console.log(lastRow);
console.log(lastCol);
//「日付」のデータ取得範囲の指定(B16~)
//getRange(16行目,2列目,●行分,列分)
const dateRange = mysheet1.getRange(16,2,lastRow-16,1);
console.log(dateRange.getA1Notation());
//「①」~「④」のデータ取得範囲の指定
//getRange(16行目,4列目,●行分,列分)
const eventRange1 = mysheet1.getRange(16,4,lastRow-16,1); //「①」セルD16(行16,列4)~
const eventRange2 = mysheet1.getRange(16,5,lastRow-16,1); //「②」セルE16(行16,列5)~
const eventRange3 = mysheet1.getRange(16,6,lastRow-16,1); //「③」セルF16(行16,列6)~
const eventRange4 = mysheet1.getRange(16,7,lastRow-16,1); //「④」セルG16(行16,列7)~
//「①登録処理」~「④登録処理」フラグのデータ取得範囲の指定
const flagRange1 = mysheet1.getRange(16,8,lastRow-16,1); //①済フラグ(セルH列)
const flagRange2 = mysheet1.getRange(16,9,lastRow-16,1); //②済フラグ(セルI列)
const flagRange3 = mysheet1.getRange(16,10,lastRow-16,1); //③済フラグ(セルJ列)
const flagRange4 = mysheet1.getRange(16,11,lastRow-16,1); //④済フラグ(セルK列)
//▼各データを配列として取得する
const myDate = dateRange.getValues(); //「日付」(myDate)
const event1 = eventRange1.getValues(); //「①」(event1)
const event2 = eventRange2.getValues(); //「②」(event2)
const event3 = eventRange3.getValues(); //「③」(event3)
const event4 = eventRange4.getValues(); //「④」(event4)
const myflag1 = flagRange1.getValues(); //「①登録処理」(myflag1)
const myflag2 = flagRange2.getValues(); //「②登録処理」」(myflag2)
const myflag3 = flagRange3.getValues(); //「③登録処理」(myflag3)
const myflag4 = flagRange4.getValues(); //「④登録処理」(myflag4)
//「登録済フラグ」配列(myflag1~4)のデータ指定
//セルB16(行16、列2)を全ての配列の起点0とし、下に1行ずつ移動
for (let i = 0; i < myDate.length; i++){
const targetflag1 = myflag1[i][6]; //「①」起点B16から下にi行、右に6列
const targetflag2 = myflag2[i][7]; //「②」E列 起点B16から下にi行、右に7列
const targetflag3 = myflag3[i][8]; //「②」F列 起点B16から下にi行、右に8列
const targetflag4 = myflag4[i][9]; //「②」G列 F列 起点B16から下にi行、右に9列
//「①」~「④」予定の配列(event1~4)のデータ指定
const targetevent1 = event1[i][2]; //「日付」起点B16から下にi行、右に2列
const targetevent2 = event2[i][3]; //「日付」起点B16から下にi行、右に3列
const targetevent3 = event3[i][4]; //「日付」起点B16から下にi行、右に4列
const targetevent4 = event4[i][5]; //「日付」起点B16から下にi行、右に5列
//「日付」の配列(myDate)のデータ指定
const targetDate = myDate[i][0]; //「日付」起点B16から下にi行、右に0列
//「①」配列(event1)に格納するデータ取得
//セルH16に「登録済」の表示がある時は、無視
//フラグなしの時、セルD16~ 起点B16から右へ2
if (targetflag1 === "登録済") {
continue
}
console.log(targetevent1);
console.log(targetDate);
//カレンダーに予定登録し、、完了したらスプレッドシート「登録処理③」に「登録済」と記載する
cal.createAllDayEvent(targetevent1,targetDate);
mysheet1.getRange(i,8).setValue("登録済"); //H列に「登録済」と記載
//「②」の配列(event2)の取得位置の指定
//セルI16に「登録済」の表示がある時は、無視
//フラグなしの時、セルE16~ 起点B16から右へ3
if (targetflag2 === "登録済") {
continue
}
console.log(targetevent2);
console.log(targetDate);
//カレンダーに予定登録し、、完了したらスプレッドシート「登録処理②」に「登録済」と記載する
cal.createAllDayEvent(targetevent2,targetDate);
mysheet1.getRange(i,9).setValue("登録済"); //I列に「登録済」と記載
//「③」の配列(event3)の取得位置の指定
//セルI16に「登録済」の表示がある時は、無視
//フラグなしの時、セルF16~ 起点B16から右へ4
if (targetflag3 === "登録済") {
continue
}
console.log(targetevent3);
console.log(targetDate);
//カレンダーに予定登録し、、完了したらスプレッドシート「登録処理③」に「登録済」と記載する
cal.createAllDayEvent(targetevent3,targetDate);
mysheet1.getRange(i,10).setValue("登録済"); //J列に「登録済」と記載
//「④」の配列(event4)の取得位置の指定
//セルK16に「登録済」の表示がある時は、無視
//フラグなしの時、セルG16~ 起点B16から右へ5
if (targetflag4 === "登録済") {
continue
}
console.log(targetevent4);
console.log(targetDate);
//カレンダーに予定登録し、、完了したらスプレッドシート「登録処理④」に「登録済」と記載する
cal.createAllDayEvent(targetevent4,targetDate);
mysheet1.getRange(i,11).setValue("登録済"); //K列に「登録済」と記載
//▼ダイアログMsgの表示
Browser.msgBox("Googleカレンダーへの転記作業が完了しました。\n登録内容はカレンダー転記シートで確認してください。",Browser.Buttons.OK);
}
}
補足情報(FW/ツールのバージョンなど)
前回レクチャーから、回答内容を読み込み、理解したつもりでしたが、
いざ次の工程を自分で書き進めると、理解できていないと痛感します。
お忙しいところ申し訳ありませんが、回答は明日以降で大丈夫なので、
次は自力でもう少し先まで進められるよう、
どこの記載で失敗したのか、ビギナーでも分かる解説をいただけます
でしょうか?
お手数をおかけして申し訳ありません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 14:51 編集
2021/12/13 15:38
2021/12/13 16:03
2021/12/18 13:31 編集