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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

解決済

【GAS】 配列で取得したデータから特定の条件に合致したデータを除外したい

donguriko
donguriko

総合スコア15

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1回答

0評価

2クリップ

702閲覧

投稿2021/12/18 13:23

編集2021/12/18 13:24

前提・実現したいこと

二次元配列でデータ取得しています。
配列内の項目は[日付(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/ツールのバージョンなど)

前回の質問の続きです。
(リンク内容)

回答は、本日中でなくて大丈夫です。
非エンジニア、ビギナーでも理解できるレベルのアドバイスまたはヒントを
いただけると助かります。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。