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

Screenshot from 2018-09-29 15-31-46
関数を書こう

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)

original_data
こんなデータがあるとする

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

keywords
この単語が含まれるタイトルを探したい!

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

kyeword_exists
真理値が返ります

冒頭のスクリプトを,読める人は読んで,仕様を感じ取ってください.「キーワード」のシートの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列の下までずーっとコピーすれば,各タイトルに「医者」が入ってるかどうかを判別できる.

コメントを残す

Powered by WordPress.com. テーマ: Baskerville 2 by Anders Noren

ページ先頭へ ↑

%d人のブロガーが「いいね」をつけました。