前提・実現したいこと
二次元配列でデータ取得しています。
配列内の項目は[日付(B)、予定①~④(D~G),登録処理①~④(H~K),対象判定(L)]の4つです。
「対象判定(ngFlag)==="対象外"」の時、配列からその行データ(配列要素4項目とも)を
削除したいです。
<背景>
配列データを元にGoogleカレンダーに予定登録する際、上記削除処理をしないと、
日付は配列内にデータありのため、土日祝日分は件名なしでカレンダーに予定が
登録されてしまう。これを回避したい。
※類似で、処理開始時点でスプレッドシートH列~K列に「登録済」のフラグが
あるデータも除外したい。
おそらくコレは、「対象判定(ngFlag)==="対象外"」の時の除外と同じやり方で
回避できるのではないかと推測。
<スプレッドシートイメージ:現在のコードで処理後のイメージです>
困っていること
IF文で「対象判定(ngFlag)==="対象外"」の時で条件指定し、
slice関数で除外 するのか? と考えたのですが、
行インデックスは固定ではなく、可変。(セルC10の数値が変わると変動)
どのようにslice関数で削除する行インデックスを指定すればよいのか、思いつきません。
対象行は可変なので変数を使う???
①どうすれば除外する行インデックスの指定ができるか、
配列から該当行データを除外できるかのアドバイス(ヒント)を
いただけないでしょうか?
②IF文をかませる方法で正解の場合、
IF文とfOR文どちらを先に書けばよいのか、悩みました。
ngFlagはfor文のところでlet指定しているので、FOR文が先が
正解ですか?
コード記載の方法がよく分からないので解説いただけないでしょうか?
該当のソースコード
以下、コード全文記載します。
function createEvent() {
//▼予定を追記するGoogleカレンダーIDを取得する <<セルC9(行9,列3)
const ss = SpreadsheetApp.getActiveSpreadsheet();
const mysheet1 = ss.getSheetByName("カレンダー転記用");
const calId = mysheet1.getRange(9,3).getValue();
const cal = CalendarApp.getCalendarById(calId);
const targetRows = mysheet1.getRange('C13').getValue();
console.log("targetRows "+ targetRows);
//予定①~予定④に予定なし分(土、日、祝日)はL列にフラグ立て
const endRow = targetRows + 15
console.log("endRow " +endRow);
for(let i=16; i < endRow+1; i++){
const myRange = mysheet1.getRange(i,4,1,4);
if(myRange.isBlank()){
mysheet1.getRange(i,12,1,1).setValue("対象外");
//getRange(行目,列目,●行分,●列分)
}
}
//▼データ取得範囲の指定
//各種予定のデータ取得範囲の指定
//getRange(行目,列目,●行分,●列分)
//予定配列>>セルB16(行16,列2)~L列まで
const eventRange = mysheet1.getRange(16,2,targetRows,11);
console.log("eventRange "+eventRange.getA1Notation());
//▼各予定データを配列(myEvent)として取得する
const myEvent = eventRange.getValues();
Logger.log(myEvent);
//各配列のデータ取得取得位置の指定
//▼「①予定」の取得
//取得する項目は「予定名(title1)」「日付(myDate1)」「登録済フラグ(flag1_1)」「対象外フラグ(ngFlag)」の4つ
for(let i=0; i < targetRows; i++){
let title1 = myEvent[i][2]; //「①予定名」は起点0(B16)から下にi行、右に2
let myDate1 = myEvent[i][0]; //「日付」は起点B16から下にi行、右に0
let flag1_1 = myEvent[i][6]; //「①登録済フラグ」は起点B16から下にi行、右に6
let ngFlag = myEvent[i][6]; //「対象外フラグ」は起点B16から下にi行、右に10
//★うまくできない★ 「対象外フラグ(ngFlag)」対象外フラグあり行インデックスを配列から除外
//if (ngFlag !== "対象外"){ ????
//★うまくできない★ 「登録済フラグ(flag1_1)行インデックスを配列から除外
//▼カレンダーへの予定登録
//cal.createAllDayEvent(title1,new Date(myDate1));
//▼スプレッドシートへの「登録済」フラグ記載
//getRange(行目,列目,●行分,●列分) >>セルH16以降に転記
mysheet1.getRange(16,8,targetRows,1).setValue("登録済"); //スプシH列に「登録済」と追記
}
//▼「②予定」の取得
//取得する項目は「予定名(title2)」「日付(myDate2)」「登録済フラグ(flag2)」「対象外フラグ(ngFlag)」の4つ
for(let i=0; i < targetRows; i++){
let title2 = myEvent[i][3]; //「②予定名」は起点0(B16)から下にi行、右に3
let myDate2 = myEvent[i][0]; //「日付」は起点0(B16)から下にi行、右に0
let flag2 = myEvent[i][7]; //「②登録済フラグ」は起点0(B16)から下にi行、右に7
let ngFlag = myEvent[i][6]; //「対象外フラグ」は起点B16から下にi行、右に10
//★うまくできない★ 「対象外フラグ(ngFlag)」対象外フラグあり行インデックスを配列から除外
//★うまくできない★ 「登録済フラグ(flag2)行インデックスを配列から除外
//▼カレンダーへの予定登録
//cal.createAllDayEvent(title2,new Date(myDate2));
//▼スプレッドシートへの「登録済」フラグ記載
//getRange(行目,列目,●行分,●列分) >>セルI16以降に転記
mysheet1.getRange(16,9,targetRows,1).setValue("登録済"); //スプシI列に「登録済」と追記
}
//▼「③予定」の取得
//配列内の項目は「予定名(title3)」「日付(myDate3)」「登録済フラグ(flag3)」「対象外フラグ(flag1_2)」の4つ
//「登録済フラグ(flag3)」に「登録済」の表示がある時は、処理しない
for(let i=0; i < targetRows; i++){
let title3 = myEvent[i][4]; //「③予定名」は起点0(B16)から下にi行、右に4
let myDate3 = myEvent[i][0]; //「日付」は起点0(B16)から下にi行、右に0
let flag3 = myEvent[i][8]; //「③登録済フラグ」は起点0(B16)から下にi行、右に8列
//★うまくできない★ 「対象外フラグ(ngFlag)」対象外フラグあり行インデックスを配列から除外
//★うまくできない★ 「登録済フラグ(flag3)行インデックスを配列から除外
//▼カレンダーへの予定登録
//cal.createAllDayEvent(title3,new Date(myDate1));
//▼スプレッドシートへの「登録済」フラグ記載
//getRange(行目,列目,●行分,●列分) >>セルJ16以降に転記
mysheet1.getRange(16,10,targetRows,1).setValue("登録済"); //スプシJ列に「登録済」と追記
}
//▼「④予定」の取得
//配列内の項目は「予定名(title4)」「日付(myDate4)」「登録済フラグ(flag4)」「対象外フラグ(flag1_2)」の4つ
//「登録済フラグ(flag4)」に「登録済」の表示がある時は、処理しない
for(let i=0; i < targetRows; i++){
let myDate4 = myEvent[i][0]; //「日付」は起点0(B16)から下にi行、右に0
let title4 = myEvent[i][5]; //「④予定名」は起点0(B16)から下にi行、右に5
let flag4 = myEvent[i][9]; //「④登録済フラグ」は起点0(B16)から下にi行、右に9列
//★うまくできない★ 「対象外フラグ(ngFlag)」対象外フラグあり行インデックスを配列から除外
//★うまくできない★ 「登録済フラグ(flag4)行インデックスを配列から除外
//▼カレンダーへの予定登録
//cal.createAllDayEvent(title4,new Date(myDate4));
//▼スプレッドシートへの「登録済」フラグ記載
//getRange(行目,列目,●行分,●列分1) >>セルK16以降に転記
mysheet1.getRange(16,11,targetRows,1).setValue("登録済"); //スプシK列に「登録済」と追記
}
//▼ダイアログMsgの表示
Browser.msgBox("Googleカレンダーへの転記作業が完了しました。\n登録内容はカレンダー転記シートで確認してください。",Browser.Buttons.OK);
}
補足情報(FW/ツールのバージョンなど)
前回の質問の続きです。
(リンク内容)
回答は、本日中でなくて大丈夫です。
非エンジニア、ビギナーでも理解できるレベルのアドバイスまたはヒントを
いただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/19 09:05 編集
退会済みユーザー
2021/12/23 12:50 編集
2022/01/09 08:46
退会済みユーザー
2022/01/09 09:29
2022/01/09 10:04