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

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

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

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

JavaScript

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

Q&A

解決済

3回答

639閲覧

【google apps script】条件に一致しなった値を検索するスクリプト

ruallout

総合スコア20

Google スプレッドシート

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2023/03/16 09:04

実現したいこと

google apps scriptで条件に一致しなった値を検索するスクリプトを作ろうとしています。

前提

スプレッドシートから取得した値のリストA(Values1)、
PDFがフォルダからファイル名を取得した値のリストB(Values2)を作り
それぞれ比較して、一致なかった値を探し出したいと考えております。

一致した値を検索するVloolkup的なスクリプトを以前、記事を参考にして作ったことがあったので、
厳密比較演算に!(否定)をつければ、一致しなかった値が取れるのかと考えましたが甘かったです。

var Notmatch = []; for(let i = 1; i < Values1.length; i++){ for( let j = 0; j < Values2.length; j++){ if(Values1[i] !== Values2[j]){ Notmatch.push(Values1); } //for_j }//for_i }//for_If

完全に行き詰ってっしまったので質問させて頂きました。

目的を達成できるコード、もしくは他の考え方があればご教授お願いいたします。

発生している問題・エラーメッセージ

### 該当の全体ソースコード ```google apps script function getFileList2_2() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('XXX'); var lastRow2 = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); Logger.log(lastRow2); const Values1 = sheet.getRange(2, 3, lastRow2).getValues().flat(); console.log(Values1); // 指定フォルダ内のファイルを一括取得(FileIteratorオブジェクト) const files = DriveApp.getFolderById('xxxxxxxx').getFiles(); let arrFiles = []; while (files.hasNext()) { const file = files.next(); const name = file.getName(); arrFiles.push(name); } let List1 = arrFiles.filter(rowData => rowData.indexOf('2023') !==-1); let Values2 = List1.map((value) => {return value.replace('.pdf','').slice(10);}); console.log(Values2); var Notmatch = []; for(let i = 1; i < Values1.length; i++){ for( let j = 0; j < Values2.length; j++){ if(Values1[i] !== Values2[j]){ Notmatch.push(Values1); } //for_j }//for_i }//for_If console.log(Notmatch); }```

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

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

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

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

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

YellowGreen

2023/03/16 09:26

フラグとする変数をjのfor文の前で宣言して初期値をfalseにしておき、 jのfor文の中では不一致ではなく一致を判定して一致したらフラグをtrueにしてbreak jのfot文終了後にフラグを判定してfalseだったら pushで希望どおりの動作になりますか?
YellowGreen

2023/03/17 01:36

> これでいいですか? Values1のファイル名には同じ名前のものが含まれている可能性があるのですね。
ruallout

2023/03/17 10:14

お世話になっております。 遅くなり申し訳ございません。 ご確認頂きありがとうございます。 Values1には同じ名前のファイル名が含まれていることはないです! ただし、Values2のファイル名には記号(・)が入る場合があるので、 Values1とValues2を部分一致で比較できればいいなと思っています💦
YellowGreen

2023/03/17 10:38

Values2のファイル名は、Values1•xxxxのようにValues2の•の前までとValues1とを比較すればいいのでしょうか? 部分一致とはどのように部分一致すればいいのかお教えください。
guest

回答3

0

お示しいただいたコードに沿って修正するならば、
次のようになると思います。

コードのコメントにも書きましたが、
Values1は値の取得が2行目からなので
forループのインデックス i は 0 からでいいのではないでしょうか。

それから、二重にforループを使っていてインデックスが煩わしいときは、
for (const value1 of Values1) {
...
for (const value2 of Values2) {
if (value1 == value2) {
...
Nomatch.push(value1);
のようにするとインデックスがなくなってすっきりします。

既に回答が付いてますが、質問のコードの修正方法として回答しました。
他の方の回答のコードの方が短くてスマートな気がします。
ただ、new Set()は無い方が、
シートに重複して同一ファイル名の記載があった場合に気づきやすくなると思います。

GAS

1 var Notmatch = []; 2 for (let i = 0; i < Values1.length; i++) {//←値の取得が2行目からなので let i = 0 でよいのでは? 3 let isMatch = false;//←マッチしたかどうかのフラグ 4 for (let j = 0; j < Values2.length; j++) { 5 if (Values1[i] == Values2[j]) {//←マッチしたらフラグをtrueにして j のループを抜ける 6 isMatch = true; 7 break; 8 } 9 }//for_j 10 if (!isMatch) {//←値がfalseのとき 11 Notmatch.push(Values1[i]);//←インデックスを付ける 12 } 13 }//for_i 14 console.log(Notmatch);

投稿2023/03/17 06:37

YellowGreen

総合スコア680

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

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

0

正規表現使わないですよね?

  1. includesは配列だけではなく文字列にも使える(文字列状態だと部分一致可能)
  2. 配列の状態で部分一致する関数がない(なのでループを回す必要がある)

以上を踏まえると下記になります。
everyって関数が2重ループの内側のループ部分になります。

GAS

1 const Values1 = ['ファイル名A', 'ファイル名B', 'ファイル名C', 'ファイル名F', 'ファイル名Z', 'イル', '名D', '名B']; 2 const Values2 = ['ファイル名C','ファイル名D', 'ファイル名A', 'ファイル名E']; 3 const result = [...new Set(Values1.map(x => Values2.every(xx => !xx.includes(x)) ? x : '').filter(x => x))]; 4 console.log(result); // ファイル名B, ファイル名F, ファイル名Z, 名B

投稿2023/03/17 10:40

minehan

総合スコア170

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

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

0

ベストアンサー

Apps

1 const Values1 = ['ファイル名A', 'ファイル名B', 'ファイル名C', 'ファイル名F', 'ファイル名Z']; 2 const Values2 = ['ファイル名C','ファイル名D', 'ファイル名A', 'ファイル名E']; 3 const result = [...new Set(Values1.map(x => !Values2.includes(x) ? x : '').filter(x => x))]; 4 console.log(result); // ファイル名B, ファイル名F, ファイル名Z

これでいいですか?

投稿2023/03/16 16:34

minehan

総合スコア170

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

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

ruallout

2023/03/17 10:10

お返事遅れて申し訳ありません。 ご回答いただきありがとうございます! まさにこれでした!ご丁寧にコードを記載頂きありがとうございます。 追加の質問で恐縮なのですが、includesのような完全一致ではなく、matchのような部分一致で実装する場合はどの様にコードをかけるのでしょうか? お手数でなければご返信頂ければ幸いです。 何卒よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問