このセルは特定の文字列を含む?を検証するスクリプト@Googleスプレッドシート

Google Apps Scriptって面白い.こんな関数でどうでしょう.
function isContain(name) {
var sheet = SpreadsheetApp.getActive().getSheetByName(“キーワード”);
var keywords = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
return keywords.some(check, name);
}
var check = function(k) {
return this.indexOf(k) !== -1;
};
文字列の柔軟な検索したいよね
例えば,漫画「ブラックジャック」の各エピソードの作品番号,掲載年月日,サブタイトル,あらすじか何かを並べたデータを持ってる時に,「タイトルに特定の文字列を持ってる作品だけを取り出したいなぁ」と思ったとするでしょ.(ちなみに出典は http://www.ne.jp/asahi/blackjack/list/index.htm)

これらの作品の中から, (複数の) 特定の文字列が入ってる作品を抽出したい!と思ったとするじゃん.一発で.

みたいな.つまり,具体的に言うと「タイトルに『医者』か『ピノコ』か『女』か『男』か…のいずれかが含まれてる作品を検索したい!」という意味ね.これらのキーワードたちは同じブックの別のシートに書いてある想定.そんな時,ちょうどいい関数がGoogleシートには存在しないみたい.だから作るしか無い.

冒頭のスクリプトを,読める人は読んで,仕様を感じ取ってください.「キーワード」のシートのA列にしかキーワードを書いちゃダメで,check関数を引数 (?) なしで呼んでもダメなので気をつけてください…
GASの仕様は古すぎるよ!使えないのが多い…
で,言いたいのはここから.実は2018年9月現在,最新のJaveScriptならこれを3行で済ませることが出来る (はず…).
function isContain(name) {
var sheet = SpreadsheetApp.getActive().getSheetByName(“キーワード”);
var keywords = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
keywords.some(k => neme.includes(k));
}
しかし!Google Apps Scriptの仕様でこれができないのです!その理由を説明しましょう.
(理由 1)
2017年1月7日の記事.少し古い.ここにはこんなことが書かれてる.
Google Apps Script runs on Rhino. Rhino is fairly behind the times, it’s about ECMAScript 5.1 level. Don’t expect to have any ES6 features such as sets or arrow functions.
javascript – Sets and data structures in Google Apps Script – Stack Overflow
簡単に日本語訳すれば「GASはRhinoで走っていて,RhinoはECMAScript 5.1レベルだから,arrow
関数のようなES 6の機能は使えないよ」ということで,some
メソッドの中のこの関数は使用できないのです!確かにそれらしきエラーがスクリプトエディタ画面にも表示されてた.
k => name.includes(k)
(理由 2)
本質的には原因は同じで,「Rhinoが古い」ということに尽きるんだけど.実はincludes
メソッドも新しいようです.こんな記事も見付けました.2017年6月2日の記事.
includesメソッドはECMAScript 2015(ECMAScript 6)で追加されたメソッドであり、古いブラウザでは利用できない場合がありますので、利用には注意が必要です。
JavaScript 文字列を含むかどうかの判定【contains/includes/部分一致の検索】 | MaryCore
…はい.ということでarrow
関数もincludes
メソッドもGASでは使用できないようです.なので僕がさっき挙げたコード例は少し回りくどく,関数を2つ書いて実装していたのでした.
単純なテキストの比較なら出来るよね
ちなみに探したいキーワードが1つだけなら,こんなことしなくても簡単に出来るよね.例えばセルC2に書かれてるテキストの中に「医者」という文字列が入ってるかどうかを調べたいなら
=if(countif(C2,”*医者*”)>0,”ある”,”ない”)
と書けば判定できる.これをE列の下までずーっとコピーすれば,各タイトルに「医者」が入ってるかどうかを判別できる.