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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

2回答

640閲覧

セルに入力された年・月と同じ年月があれば行削除させたい

mogumogu7210

総合スコア8

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2020/03/15 13:54

前提

スプレッドシートのD1セルは年、E1セルは月がそれぞれプルダウンで選択できるようになっています。

・B3:Bには年月日が入力されています。(2020/03/15)
・C3:Cには同行のB列セルに入力された年が表示されるよう下の数式が入っております。
=IF(B3="","",YEAR(VALUE(B3)))  ※最終行までオートフィル
・D3:Dには同行のB列セルに入力された月が表示されるよう下の数式が入っております。
=IF(B3="","",MONTH(VALUE(B3)))  ※最終行までオートフィル

実現したいこと

D1とE1の年月とC列D列に表示される年月が一致していたら
その行を削除させたい。

困っていること

エラーは出ませんが、動きません。
デバックしてみると
if(range == DEValues){
の行まではいけるのですが、
range.deleteRows(i);
に行かず、
for(var i = 3; i <= lastRow; i++){
に戻ってしまいます。
どこが違うのか、現時点で検討がつきません。
ご教示いただけると幸いです。

GAS

1function rowDelete(){ 2 var sh = SpreadsheetApp.openById('ID').getSheetByName("シート名"); 3 4 var lastRow = sh.getLastRow(); 5 var DEValues = sh.getRange('D1:E1').getValues(); 6 7 for(var i = 3; i <= lastRow; i++){ 8 var range = sh.getRange('C' + i + ':D' + i).getValues(); 9 10 if(range == DEValues){ 11 range.deleteRows(i); 12 13 } 14 } 15} 16

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

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

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

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

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

guest

回答2

0

function rowDelete(){
var sh = SpreadsheetApp.openById('ID').getSheetByName("シート名");

var lastRow = sh.getLastRow();
var DEValues = sh.getRange('D1:E1').getValues();
const DE = [DEValues];

for(var i = lastRow; i >= 3; i--){
var range = sh.getRange('C' + i + ':D' + i).getValues();
const CD =[range];

if(CD.toString() == DE.toString()){ sh.deleteRows(i); }

}
}

投稿2020/03/17 02:21

mogumogu7210

総合スコア8

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

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

0

ベストアンサー

if(range == DEValues) 配列同士の比較はその配列がもっている値での比較ができません。
たとえば
if(range[0][0] === DEValues[0][0] && range[0][1] === DEValues[0][1]) のようにする必要があります。

また、ループ中で行削除を行っていますが、行削除を行った場合、行番号が繰り上がるため、1行チェックから漏れることになります。
for(var i = lastRow; i >= 3; i--)
後ろから処理しましょう。

投稿2020/03/16 02:14

macaron_xxx

総合スコア3191

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

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

mogumogu7210

2020/03/16 15:33

ご回答いただき、ありがとうございます! 配列同士の比較、試してみましたが、やはりエラーは出ず、動かず。。 初心者なりに探ってみて 型が揃ってないのかと、typeof演算子を使ってみたところ、どちらもobjectと返ってきました。 これが原因なのでしょうか。。 質問ばかりで申し訳ありません。
mogumogu7210

2020/03/17 02:23

自己解決できました! キレイなコードではないかもしれませんが^^; macaron_xxx様、ヒントをありがとうございました!
macaron_xxx

2020/03/17 23:04

配列の比較は参照オブジェクトが一致しているか、という観点でしか評価しません。 そのため const a = [1, 2]; const b = a; とした場合には、a === bが成立します(true)が const a = [1, 2]; const b = [1, 2]; とした場合には、別のオブジェクトなのでa === bは成立しません(false) a === bとなる場合にはa[0] = 1としたときにb[0]も1に変わります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問