04
2021
04

RSI get Cosmetic component from FC1 report

function RSI() {  
  var str =  SpreadsheetApp.getUi().prompt("Please enter FC1 tested component").getResponseText()                            //取得輸入資料
  
  if(str.trim().length==0){
    return                                                                                                                   //輸入為空/空格則返回
  }
  
  cleanData()                                                                                                                //清除除row1以外的所有資料,避免新資料同舊重疊造成出錯
  var number = getFC1componentNumber(str)                                                                                    //取得FC Component數目
  
  var FCcomponents = getRSIFC1components(str,number)                                                                         //取得FC Component資料,但如果report資訊跨頁,就會讀取非Component資料
  var FCcomponents = FCcomponents.map(item => item.toString().replace(/(\*{6,}.*)/,"").trim().replace(/[.]$/,""))            //Revised FC Component 資訊,replace **後非Component資料同最後 "."

  var FCLocation = FCcomponents.map(item => (RegExp(/\(/).exec(item))? item.toString()                                       //取得括號內FC Component的 location 資料
  .slice(item.lastIndexOf("(")+1,item.lastIndexOf(")")).trim() : "")
  
  var FCcomponents = FCcomponents.map(item => item.toString()
  .replace(item.slice(item.lastIndexOf("("),item.lastIndexOf(")")+1),"").trim())                                             //取完location資料就在FCcomponents數組刪除,避免重複

  var FCcolor = getCosmeticColor(FCcomponents)                                                                               // 用RegExp取得 CosmeticColor,如果Cosmetic物料字典不存在,則返回 ''
  var FCcomponents = FCcomponents.map((item,i) => item.toString().replace(FCcolor[i].toString(),""))                         // 取完 CosmeticColor 資料就在FCcomponents數組刪除,避免重複

  var FCmaterial = getCosmeticMaterial(FCcomponents)                                                                         // 用RegExp取得 Cosmetic物料,如果Cosmetic物料字典不存在, 則返回FC 數組index資訊
  var FCcomponents = FCcomponents.map((item,i) => item.toString().replace(FCmaterial[i].toString(),""))                      // 取完 Cosmetic物料 資料就在FCcomponents數組刪除,避免重複

  var FCwith = FCcomponents.map(item => (RegExp(/with/i).exec(item)? "with":""))                                             // 用RegExp判斷Cosmetic物料後有沒有with,有就push with,沒就''入落FCwith數組

  var FCglitterColor = getGlitterColorInfo(FCcomponents)                                                                     // 用RegExp由with開始取得glitter/shimmer顏色,到最後一個glitter/shimmer
  
  var FCglitterInfo = FCcomponents.map(item => (RegExp(/glitter|shimmer/i).exec(item))?                                      // 用RegExp判斷glitter/shimmer是否存在,有就push glitter/shimmer,沒就''
  item.toString().match(/.*((glitter|shimmer).*)/i)[1].trim():"")   

  WriteValueData(FCcolor,2,5)                                                                                                // 寫入資料 WriteValueData(資料數組,rowInitial,column)
  WriteValueData(FCmaterial,2,6)
  WriteValueData(FCwith,2,7)
  WriteValueData(FCglitterColor,2,8)
  WriteValueData(FCglitterInfo,2,9)
  WriteValueData(FCLocation,2,10)
  WriteComponentNumber(FCmaterial,2,1)
}

function cleanData() {                                                                                                       //清除資料
  var lastRow = sheet.getLastRow()                                                                                            
  if(lastRow<2) {
    return                                                                                                                   //row小於2,即第一行就不delete
  }
  sheet.deleteRows(2,lastRow-1);                                                                                             //delete剩第一行
}

function getFC1componentNumber(str) {                                                                                        //取得FC Component數目
  var number = 1
  while(str.indexOf("("+(number+1)+")")!=-1) {
    number++
  }
  return number
}

function getRSIFC1components(str,number) {                                                                                   //取得FC Component資料,用slice分割每個component資料
  var arr = []
  for(var i=1;i<number+1;i++) {
    if(i==number) {
      var message = str.slice((str.indexOf("("+i+")")+i.toString().length+2),str.length)                                     //最後component因為沒有下一個component,最尾就是str長度
      arr.push(message)
      break
    }
    var message = str.slice((str.indexOf("("+i+")")+i.toString().length+2),str.indexOf("("+(i+1)+")"))                       //取得由該component到下一個component之前的資料
    arr.push(message)
  }
  return arr
}

function getCosmeticColor(FCcomponents){
  var arr = []                                                                                                              //(.*?)就是讀取任何文字開頭,數目不限,直到見到comsmetic物料就直接結束,i代表不分大小寫
  var regColor = /(.*?)(lip|eye|blush|powder|liquid|mascara|bath|paste\b|glitter|gel|nail|thinner|bronzer|hand|lotion|cream|solution|face|body)/i 
  for(var i=0;i<FCcomponents.length;i++) {
    try{
      var color = FCcomponents[i].match(regColor)[1].trim()                                                                  //cosmetic物料之前就複判定為顏色字眼
    } catch(err) {                                                                                                           
      var color = ""                                                                                                         //找不到cosmetic物料就將color輸入''
    }
    arr.push(color)
  }
  return arr
}

function getReg(FCcomponents,i) {
  if(RegExp(/with/i).exec(FCcomponents[i])) {                                                                                //由comsmetic物料就開始,到with結束之間的資料
    var reg = /((lip|eye|blush|powder|liquid|mascara|bath|paste\b|glitter|gel|nail|thinner|bronzer|hand|lotion|cream|solution|face|body).*).*(with)/i
    return reg
    } 

  if(RegExp(/glitter|shimmer/i).exec(FCcomponents[i])) {                                                                     //由comsmetic物料就開始,到glitter/shimmer結束之間的資料
    var reg = /((lip|eye|blush|powder|liquid|mascara|bath|paste\b|glitter|gel|nail|thinner|bronzer|hand|lotion|cream|solution|face|body).*).*(glitter|shimmer)/i
    return reg
  }                                                                                                                          //由comsmetic物料就開始,到string結束之間的資料
                                                                                                                             
  var reg = /((lip|eye|blush|powder|liquid|mascara|bath|paste\b|glitter|gel|nail|thinner|bronzer|hand|lotion|cream|solution|face|body).*)/i
  return reg 
}

function getCosmeticMaterial(FCcomponents){
  var arr = [] 
  for(var i=0;i<FCcomponents.length;i++) {
    var reg = getReg(FCcomponents,i)                                                                                         //找reg來配對資料
    
    try {
      var material = FCcomponents[i].match(reg)[1].trim()                                                                    //配對資料,cosmetic物料在字典找到就配對到,擺落cosmetic物料到
    } catch(err) {
        var material = FCcomponents[i].toString().trim()                                                                     //cosmetic物料在字典找不到時就將整個component擺落cosmetic物料到
      }                                                                                                                      //到時在加落字典
     
    arr.push(material)
  }
  return arr
}

function getGlitterColorInfo(FCcomponents) {                                                                                 //取得gliiter/shimmer顏色
  var arr =[]
  for(var i=0;i<FCcomponents.length;i++) {
    if(RegExp(/with/i).exec(FCcomponents[i])) {                                                                              //如果在FCcomponents[index]找到with時
      var R = FCcomponents[i].toString()
      
      if(RegExp(/glitter|shimmer/i).exec(R)) {                                                                               //如果在FCcomponents[index]找到glitter/shimmer時
        var message = R.match(/(?:with)(.*)(glitter|shimmer)/i)[1].trim()                                                    //(?:with)令R.match不出第一個括號的值(即with),變相出第2個括號的值(即.*)
        arr.push(message)                                                                                                    ///(?:with)(.*)(glitter|shimmer)/i由with開始,到glitter/shimmer結束
        continue
      }
      
      var message = R.substring(R.indexOf("with")+4,R.length)                                                                //如果在FCcomponents[index]找不到glitter/shimmer時
      arr.push(message.trim())                                                                                               //就用substring方式取得with之後開始,到句子結束的值
      continue
    }
    arr.push("")                                                                                                             //如果在FCcomponents[index]找不到with時,就push''
  } 
  return arr
}

function WriteValueData(data,row,column) {                                                                                   //WriteValueData(資料數組,rowInitial,column)
  sheet.getRange(row,column,data.length).setValues(data.map(arr => [arr]))                                                   //將數組轉成[[],[],[]] 寫入資料
}

function WriteComponentNumber(Arr,row,column) {                                                                              //寫component number
  sheet.getRange(row,column,Arr.length).setValues(Arr.map((item,i) => [item.toString().replace(item,(row-1+i))]))            //將數組資料轉成component number寫入資料
}

// 字典內的cosmetic 物料
// lip gloss
// lipgloss
// eyeshadow 
// eye shadow 
// blush
// blusher
// powder
// liquid 
// mascara 
// lip balm
// lipbalm
// bath bomb
// paste
// lip gel
// hand
// lotion
// cream
// solution
// face
// body




« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。