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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

394閲覧

スプレッドシートから2次配列で正規表現を配列に取り込むとエラーが出る

sesamegg

総合スコア12

Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/06/29 13:24

前提・実現したいこと

GASでGメールの添付ファイルごとにフォルダを作成ないし検索して保存をしたいです。
保存するファイルのタイトルは、BAもしくはBBで始まり、
()の中に、頭がAA,ABなどの2~3文字のアルファベットと数字からなる
コードが付けられています。
※BA(AA数字).PDF 等
ファイルの到着はBAが来てからBBが来る順番です。
ドライブのフォルダはAA,AB,AC…というように複数あり、スプレッドシートに
A列 B列 C列
AA /AA[0-9]/ DriveApp.getFolderById('AAのフォルダID')
と入力してあります。
スプレッドシートから拾ってきた正規表現を使って、
フォルダを振り分けるtest関数のところでエラーが出てしまいます。
正規表現を
var AA = /BB(AA.*?/;
フォルダを
var F_AA = DriveApp.getFolderById('AAのフォルダID');
と直で定義したものは動いていたので、2次配列が悪さをしているのではと疑っています。
何卒お力添えをお願い致します。

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

実行に失敗: TypeError: オブジェクト /AA[0-9]/ で関数 test が見つかりません。(行 28、ファイル「コード」)

該当のソースコード

var BA = /^BA(/;//BA(から始まる var BB = /^BB(/;//BB(から始まる var LAST = /).*/;//)以降 var SEARCH_TERM = 'has:attachment';//添付ファイルがあるメール function fetchFile(){ var sheet = SpreadsheetApp.getActiveSheet(); var check = sheet.getRange('A1:C10').getValues(); //正規表現とフォルダのリスト var myThreads = GmailApp.search(SEARCH_TERM, 0, 200); //条件にマッチしたスレッドを検索して取得 var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納 for(var i in myMessages){ for(var j in myMessages[i]){ var attachments = myMessages[i][j].getAttachments(); //添付ファイルを取得 myMessages[i][j].markRead(); //メッセージを既読にする for(var k in attachments){ var str = attachments[k].getName();//ファイル名取得 if(BA.test(str)){//タイトルにBAが含まれる var foldername = fetchData(str,BA,LAST);//フォルダ名抽出 for(var l in check){ if(check[l][1].test(str)){ var a =getFolder(check[l][2],foldername);//フォルダを探す if(typeof a !== "undefined"){ continue;//フォルダが存在したらスキップ } var newfolder = check[l][2].createFolder(foldername);//フォルダ作成 newfolder.createFile(attachments[k]); //BAファイル保存 } } } if(BB.test(str)){//タイトルにBBが含まれる var foldername = fetchData(str,BB,LAST);//フォルダ名抽出 for(var l in check){ if(check[l][1].test(str)){ var a = getFolder(check[l][2],foldername);//フォルダを探す if(typeof a === "undefined"){//フォルダがなかったら var content = "ドライブに" + foldername + "のフォルダが存在しません。\n確認してください。\n\nsend from GAS" MailApp.sendEmail('*****@GMAIL.COM', 'エラーログ', content); continue; } var b = getFile(a,str);//フォルダaの中にファイルstrがいるかどうか if(typeof b === "undefined"){//ファイルが存在しなかったら a.createFile(attachments[k]); //BBファイル保存 } } } } }}} } function fetchData(str, pre, suf) { var foldername = str.replace(pre, '').replace(suf, ''); return foldername; } function getFolder(pass,key) { var folder = pass.getFoldersByName(key); var a = folder.next();//最初にヒットしたkey名のフォルダ return a ; } function getFile(pass,key) { var files = pass.getFilesByName(key); var b = files.next();//最初にヒットしたkey名のファイル return b ; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここcheck[l][1].test(str)でエラーだと思います。
原因はこの処理でシートの「/AA[0-9]/」が文字列になることです("/AA[0-9]/")。

対処方法はnew RegExp(check[l][1]).test(str)str.match(check[l][1])だと思いますが、今のB列の値では/がエスケープされて「/AA0/」などにしかマッチしません。
substrするか、可能ならそもそもB列から最初と最後の/を取るかの手当が必要です

投稿2019/06/30 15:35

papinianus

総合スコア12705

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

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

sesamegg

2019/07/01 07:32

ご指摘の通り修正したところ無事走りました! string型は何となく想像していたのですが、””で囲まれている扱いで/ごと文字列扱いされているとは盲点でした。回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問