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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1371閲覧

GAS 当てはまらない「名前」のみ抽出する方法(Javascript)

ri22

総合スコア13

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/10/20 01:51

こんにちは。GASの勉強を始めた者です。
「A1:A12」の名前リストから「C1:C5」の名前を除外した結果だけを表示させたいですが、うまく行きません、、

※欲しい結果:「C1:C5」の名前を除いた「Candy,Din,Pole,Nancy,Evan,Danny,Will」

イメージ説明

試したコードはこちらですが、結果として全ての名前(A1:A12)がそのまま出力されました。
除外されず、、、

gs

1function TEST() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var Lr = sheet.getLastRow(); 4 var Lc = sheet.getLastColumn(); 5 var Values = sheet.getRange(1, 1, Lr,Lc).getValues(); 6 var Count = Values.length; 7 var Box = "" 8 var Box2 = "" 9 var res = "" 10 11 for(var i = 0; i < Count; i++) { 12 Box = Values[i][0]; 13 Box2 = Values[i][2]; 14 if (Box != Box2) 15 { 16 res += Values[i][0]; 17 } 18 } 19 Browser.msgBox(res); 20} 21

勉強を初めて間もないので、お手数ですが、正しいコードを書いていただけたら嬉しいです。
他に良い(簡単な)書き方がありましたら、ぜひお願いします。
よろしくお願いいたします。m(__)m

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

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

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

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

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

guest

回答2

0

ベストアンサー

提示されているコードは、同じ行のA列とC列の値を比較して、一致しないものを表示しているためです。
考え方としては、A列1項目ごとに、C列の値をループして比較する必要があります。

変更したコードはこんな感じです。

JavaScript

1function myFunction() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var Lr = sheet.getLastRow(); 4 var Lc = sheet.getLastColumn(); 5 var Values = sheet.getRange(1, 1, Lr,Lc).getValues(); 6 var Count = Values.length; 7 var Box = "" 8 var Box2 = "" 9 var res = "" 10 11 for( var i = 0; i < Count; i++ ) { 12 var found = false; 13 for( var j = 0; j < Count; j++ ) { 14 if( Values[i][0] === Values[j][2] ) { 15 found = true; 16 break; 17 } 18 } 19 if( !found ) 20 res += Values[i][0]; 21 } 22 23 Browser.msgBox(res); 24}

(別解)Array.prototype.filterArray.prototype.reduceを使えばもっとシンプルに書けます。

JavaScript

1function myFunction2() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var Lr = sheet.getLastRow(); 4 var Lc = sheet.getLastColumn(); 5 var Values = sheet.getRange(1, 1, Lr,Lc).getValues(); 6 var Count = Values.length; 7 var Box = "" 8 var Box2 = "" 9 var res = "" 10 11 var list1 = Values.map( function(x) { return x[0] } ); 12 var list2 = Values.map( function(x) { return x[2] } ); 13 14 var res = list1.filter( function(x) { return list2.indexOf(x) === -1 } ) 15 .reduce( function(x, y) { return x + y } ); 16 17 Browser.msgBox(res); 18}

GASがアロー関数に対応すればもっとシンプルにかけるんですが。。。
C#erとしては、この書き方は気持ち悪い。

投稿2019/10/20 02:43

編集2019/10/20 02:48
draq

総合スコア2573

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

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

ri22

2019/10/20 03:44

なるほど。。!完璧です!求めていた結果が出ました!やっと。。(涙) 本当に、本当にありがとうございます。 良い勉強になりました。m(__)m
guest

0

こんにちは

まずC列の値の配列を得てから、A列の値のうちC列に含まれないものの配列を得るという、2段階で結果を得るという考え方で、以下を作成しました。

GoogleAppScript

1// 指定の一列の値を配列にして取得する関数(空文字列は除去) 2function getValuesOfOneColumn(sheet, col) { 3 return sheet.getRange(1, col, sheet.getLastRow(), col) 4 .getValues() 5 .map(function(ary) { return ary[0]; }) 6 .filter(function(value) { return !!value; } ); 7} 8 9function TEST() { 10 // スプレッドシートを取得 11 var sheet = SpreadsheetApp.getActiveSheet(); 12 13 // C列のセルの値を要素とする配列を得る。 14 var excludedValues = getValuesOfOneColumn(sheet, sheet.getLastColumn()); 15 16 // A列のセルの値で、かつC列にないものを要素とする配列を得る。 17 var values = getValuesOfOneColumn(sheet, 1).filter( 18 function (value) { return excludedValues.indexOf(value) < 0; } 19 ); 20 21 // values をカンマで結合した文字列を作り、表示 22 var res = values.join(","); 23 Browser.msgBox(res); 24} 25 26

上記では、各段階で使う、「指定列に含まれる値を配列で得る」という処理を関数にして、メイン処理の TEST 本体の行数が短くなるようにしています。

以上、参考になれば幸いです。

追記

ご質問に挙げられているコードは、「A列とC列の同じ行に同じ値がある場合に、その値を除外する」という意図のものになっています。ですので、例えば、ご質問の画面キャプチャにあるシートC列の1行目 Tom と3行目 Alex を入れ換えてから実行すると、TomAlex が除外された結果が表示されると思います。

投稿2019/10/20 04:30

編集2019/10/20 07:04
jun68ykt

総合スコア9058

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

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

ri22

2019/10/20 08:07

こういう書き方もあるのですね! ありがとうございます!勉強になりましたm(__)m
jun68ykt

2019/10/20 11:46

どういたしまして。参考になれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問