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