2017-06-22 3 views
0

文字列を検索するスクリプトを作成し、定義された語句が含まれている場合は適切なGoogleショッピングカテゴリを返します。しかし、時々私の関数は "未定義"を返し、私は本当に理由は分かりません。Google App Scriptが「未定義」を返すことがある理由を確かめてください

私は、使用するさまざまなGoogleショッピングカテゴリをすべて保持するシートと、分析する機能のデータを置く別のシートを持っています。ここで

は "未定義" 返す値の一例である:分析されている

テキスト:壁掛け>アートワーク&プリント

返される値:未定義

私のコード:

//places the correct GS Category for specific item in column E:E 
function placement() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('GSData'); 
    var values = sheet.getDataRange().getValues(); 
    for (i =1 ; i < values.length ; i++) { 
    //checks to see if the cell is blank if it is blank it runs it through the category(); 
    if (values[i][4] === ""){  
     var gsCategory = category(values[i][3]); 
     sheet.getRange(i+1,5).setValue(gsCategory); 
    } 
    } 

    //checks the phrase and the finds the best suitable Category for the product 
    function category(x) { 
    //pulls in the Sheet data and sets it equal to the "cat" variable. 
    var cat = categoryData(); 
    //search functions can be found on the search.gs file 
    //find specific keywords in the phrase then return the correct corresponding GS category 
    if(searchTowels(x)){ 
     return cat[76]; 
    }else if(searchWallHanging(x)){ 
     Logger.log(cat[39]); 
     return cat[39]; 
    }else if(searchWesterDecor(x)){ 
     return cat[37]; 
    }else if(searchLamps(x)){ 
     return cat[66]; 
    } 
    } 
} 

function categoryData() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('GSCategories'); 
    var values = sheet.getDataRange().getValues(); 
    return values; 
} 

function rawData() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('GSData'); 
    var values = sheet.getDataRange().getValues(); 
    return values; 
} 

私は商品を持っているすべての異なるカテゴリをカバーするために、さらに多くのif文を書きました。しかし、私は彼らがすべてのスペースを取るためにそれらを貼り付けたくなかった。

検索機能は:

function searchWallHanging(x) { 
    if(x.search("Wall Hangings") > 0){ 
    return true; 
    }else { 
    return false; 
    } 

は、私はちょうどスペースを節約するために、1件の検索機能が含まれています。

+0

これは単なる推測ですが、文字列の両側のスペースや単語間の余分なスペースが原因である可能性がありますか?これは目立たず、大きな問題を引き起こす可能性があります。たとえば、 "string"!= "string"などです。比較の前にtrim()とtoLowerCase()を呼び出すことによって文字列を正規化することが最善です。しかし、単語間に余分なスペースがあれば、それは役に立たないでしょう。私にとっては、「Wall Hangings」はカテゴリ名に従うのが悪いパターンのようです。アンダースコアまたはダッシュを含む小文字の単語を使用すると、文字列を比較するのがはるかに簡単になります。 –

+0

また、コードにステップインしてバグがどこにあるのか把握するために、デバッガを習得して使用する必要があります。 –

+0

私が間違っていると私を訂正しますが、単に「壁掛け」を探しているので、トリガーワード「壁掛け」の前または後にスペースがあるかどうかは関係ありません。しかし、言葉の余分なスペースやそのようなものがあれば、それは問題を引き起こすでしょう。 – Bokai

答えて

1

search()の戻り値を確認してください。明らかにそこ

function searchWallHanging(x) { 
    if(x.search("Wall Hangings") > 0){ 
    return true; 
    }else { 
    return false; 
} 

間違い私はあなたに3つの文字列を与えると、それは

  1. Purple Wall Hangings戻ります何があります -
  2. Green Dress Robes TRUE を返します -
  3. Wall Hangings Galore FALSE を返します - は未定義
  4. 0を返します。このビットでの

秘密の嘘:x.search("Wall Hangings") > 0search()としては、最初の一致を返します。したがって、例3ではクエリ文字列で始まるので、ではなく、> 0となります。簡単に修正:

function searchWallHanging(x) { 
    if(x.search("Wall Hangings") >= 0){ 
    return true; 
    }else { 
    return false; 
} 

EDITは:ああ、これは全て同様の検索に適用されます。あなたのすべての機能が上記のように見える場合、機能を完全に活用することはありません。アイデアは決して同様のコードブロックを書くことではなく、その特定のビットがさまざまなカテゴリ間でどのように動作するかを再考することができます。

+0

私は完全に同意して、私は彼らの完全な有用性に機能を利用しているとは思わない。これは私が問題を解決する方法を知っている唯一の方法でした。私は同じことを達成するためのより効果的な方法を試してみるためにこれに戻ります。それはあなたの助けと私の間違いを指摘してくれてありがとうと言われています。 – Bokai

関連する問題