現在、Gmailで添付した画像からOCRでテキストを取得し、そのテキスト内の単語と、事前に設定したスプレッドシートの単語とURLのリストで一致するものを置換し、返信するところまでは出来ます。
しかし、「東京」「東京都」「東京都知事」といった単語をリストに設定し、置換した際に「東京都知事」で置換されず「東京」のみがハイパーリンクに置換されるようになっています。
スプレッドシートのリストを文字列の長さ順に並び替えたので、これを上から順番に置換するようにできれば「東京都知事」になるのではないかと考えたのですが、その方法がわかりません。上から順番に置換するよう設定する以外の方法でも、目的が達成可能なものでしたら構いません。
また、一度「東京」で置換を行うと、その後「東京」の文字列があっても置換が行われなくなります。この問題を解決することは可能でしょうか。
単語リスト 置換したい単語とURLを文字列の長さ順でスプレッドシートに
置換結果 「東京都知事」で置換されず、「東京」のハイパーリンクのみ。また、それ以後の「東京都知事」「東京都」「東京」の文字も置換できない結果となる。置換が行われると単語の前後にスペースができることから、おそらくハイパーリンクとして表示されている「東京」だけでなく「東京都知事」「東京都」としても置換処理が行われたために、それ以後もできなくなっている。
追記画像 回答のアドバイスのおかげで「東京都知事」で置換されるようになりました。最初の単語以降はできない。
理想の置換結果 長い単語を短い単語で分割することなく、すべての単語が置換されるようにしたい。
1 2function parseGmail() 3{ 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); 5 var sheet = ss.getSheetByName('シート1'); 6 var settings = ss.getSheetByName('設定'); 7 8 var recipient = settings.getRange('A2').getDisplayValue(); 9 var senderName = settings.getRange('B2').getDisplayValue(); 10 var receivedFrom = settings.getRange('C2').getDisplayValue().trim(); 11 12 var body1 = settings.getRange('A4').getDisplayValue(); 13 var body2 = settings.getRange('B4').getDisplayValue(); 14 var subject = settings.getRange('C4').getDisplayValue(); 15 16 17 var val = sheet.getDataRange().getDisplayValues(); 18 var threads = GmailApp.search('from:'+receivedFrom+' has:attachment newer_than:1d; is:unread'); 19 var param = { 20 title: 'OCR File', 21 mimeType: 'image/png' 22 }; 23 var arr = ''; 24 for(var i in threads) 25 { 26 var messages = threads[i].getMessages(); 27 for(var j in messages) 28 { 29 var attachments = messages[j].getAttachments(); 30 for(var k in attachments) 31 { 32 var file = attachments[k]; 33 var type = file.getContentType(); 34 if(type.match('image')) 35 { 36 var OCR = file.copyBlob(); 37 var textDoc = Drive.Files.insert(param, file, {ocr: true}); 38 var url = textDoc.alternateLink; 39 var doc = DocumentApp.openByUrl(url); 40 var id = doc.getId(); 41 var text = doc.getBody().getText(); 42 doc.saveAndClose(); 43 Drive.Files.remove(id); 44 text = text.replace(/\n/g, '').replace(/\s/g, ''); 45 var ret = ProcessText(val, text); 46 if(ret !== false) 47 { 48 var body = body1 + ret +body2; 49 body = body.trim(); 50 MailApp.sendEmail( 51 { 52 to: recipient, 53 subject: subject, 54 name: senderName, 55 htmlBody: body 56 }) 57 } 58 } 59 } 60 messages[j].markRead(); 61 } 62 } 63} 64 65 66function ProcessText(val, text) 67{ 68 try 69 { 70 var ahref = '<a href="#URL#" target="blank">'; 71 var newText = text; 72 for(var i in val) 73 { 74 var word = val[i][0].toString().toUpperCase(); 75 var check = newText.match(word); 76 if(check !== null) 77 { 78 var Url = val[i][1]; 79 newText = newText.replace(word, ' <a href="'+Url+'" target="blank">' +word+ '</a> '); 80 } 81 } 82 return newText.trim(); 83 } 84 catch(err) 85 { 86 return false; 87 } 88}
g
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/22 12:03 編集
2020/01/22 10:31
2020/01/23 08:37
2020/01/23 08:41
2020/02/17 14:42 編集
2020/01/24 14:31
2020/01/25 06:22
2020/01/25 06:25 編集
2020/01/25 06:47