-->

iMacro เก็บสินค้า ตอน ตั้งชื่อไฟล์ CSV อัตโนมัติ

iMacro เก็บสินค้า ตอน ตั้งชื่อไฟล์ CSV อัตโนมัติ
iMacro เก็บสินค้า ตอน ตั้งชื่อไฟล์ CSV อัตโนมัติ

Imacro ตั้งชื่อไฟล์ ด้วยตัวของมันเอง

เหยด.. ตั้งชื่ออย่างหล่อ เอาละครับใครที่ใช้เครื่องมือ Imacro เพื่อการเก็บสินค้า ผมว่ายังไงเราก็ไม่อยากไปยุ่งกับมันให้มันทำงานของมันเอง ไม่ต้องตั้งค่าอะไรเลย ง่ายๆเลย เปิดหน้าเว็บกด Play รอเสร็จ เท่านั้น จบ รอไฟล์ CSV ที่มีข้อมูลอยู่ข้างใน แล้วเอาไปใช้ต่อได้เลย อ่า มันดีอย่างนี้นี่เอง


Imacro ตั้งชื่อไฟล์ CSV

เริ่มด้วยการสร้างชื่อไฟล์ CSV ไว้ในการเก็บข้อมูลที่เราอยากได้ ไฟล์ที่เราได้จะถูกเก็บไว้ในตำแหน่งที่เราระบุ ผมชอบที่จะระบุตำแหน่งไฟล์ให้เอง จะได้เป็นระเบียบในเครื่องเราด้วยครับ 

var path = "D:\\keeper";


เริ่มจากการสร้างตัวแปร โดยการประกาศค่า var path ซึ่ง แทนค่าตำแหน่ง ไปที่ไดร์ D โฟลเดอร์ keeper ซึ่งเราต้องสร้างโฟลเดอร์นี้ขึ้นมาก่อนนะครับ หากไม่มีโฟลเดอร์มันไม่รู้จะไปเก็บค่าที่เราได้ไว้ที่ไหนครับ

ได้ตำแหน่งเก็บไฟล์แล้วครับ ต่อไปเป็นเรื่องของชื่อที่จะตั้งชื่อไฟล์ ผมมองว่าเราจะเก็บสินค้ากันด้วย หมวดหมู่ของแต่ละเว็บที่เขาแบ่งไว้อยู่แล้ว และในหมวดหมู่ของแต่ละเว็บนั้น จะแสดงรายการสินค้าเรียงกันเป็นคอลัมงามๆอยู่แล้ว สมควรอย่างยิ่งที่จะเอาชื่อหมวดหมู่มาตั้งชื่อไฟล์ครับ

var path = "D:\\keeper";

//Check FileName
iimPlay("CODE:\n"
 +"TAG POS=1 TYPE=DIV ATTR=ID:categoryHeader EXTRACT=TXT\n");

จากนั้นผมให้มีการเก็บค่าชื่อขึ้นมาครับ โดยจะเก็บจากข้อมูลใน tag DIV ที่มีค่า ID ชื่อว่า categoryHeader ครับ แล้วใช้คำสั่ง EXTRACT ซึ่งเป็นการเก็บค่าของ imacro โดยจะเก็บค่า TXT

โดยส่วนใหญ่ค่า EXTRACT ที่ผมใช้บ่อยๆ จะเป็น TXT กับ HREF(เก็บลิงค์) แต่ยังมีค่าอื่นๆอีกมากครับ อาทิ TXT, HTM, HREF, ALT, TXTALL, or TITLE. อยู่ที่ว่าอยากได้อะไร

การเปิดหาค่า Tag ค่า ID Class
จาก คลิกขวาดูโค้ดตามจุดตำแหน่งนั้นแล้ว Tag ที่ผมใช้คือ DIV ครับ เพราะว่า ข้อมูลภายใน Tag DIV ตัวนี้ มีแต่ชื่อหมวดหมู่เพียวๆ(3)ไม่มี ข้อมูลอื่นมาเกี่ยวเลยครับ ไม่ต้องเข้าไปเก็บลึกย่อยถึง h1 ครับ

สังเกตตำแหน่งชื่อ ID ที่ตำแหน่งที่ (1) ก็ได้ครับ หรือมาดูที่ code ตำแหน่งที่ (2) ได้ครับ

แต่ถ้าหาก Tag อื่นเป็นหรือกำหนดค่าเป็น Class แทน เราก้อใช้ค่า Class มาระบุตำแหน่งเอานะครับ


//Check FileName
TAG POS=1 TYPE=DIV ATTR=ID:categoryHeader EXTRACT=TXT

ในส่วนของ TAG POS=1 ต้องดูให้ดีนะครับ บางครั้งถ้ามีการใช้ ค่า <div id="categoryHeader"></div> ไปก่อนหน้านี้ 1 ครั้ง

<div id="categoryHeader">ชื่อเว็บ</div>
<div id="categoryHeader">ชื่อหมวดหมู่</div> 

ค่า TAG POS=1 ต้องระบุเป็น TAG POS=2 ครับ เพราะว่าเราเก็บชื่อหมวดหมู่ ซึ่งเป็น <div id="categoryHeader"></div> อันที่ 2 นั่นเองครับ

ถ้าค่าที่เราเก็บมานั้นเป็นอะไรไม่รู้ถูกไหม ลอง Display ดูได้ครับ

var path = "D:\\keeper";

//Check FileName
iimPlay("CODE:\n"
 +"TAG POS=1 TYPE=DIV ATTR=ID:categoryHeader EXTRACT=TXT\n");

var nameFile = iimGetLastExtract();
iimDisplay(nameFile);

ผมได้ประกาศค่า nameFile ขึ้นมาและเก็บค่าที่มีการ EXTRACT ไปล่าสุดมา คือค่าที่สั่งให้เก็บมาล่าสุดนั่นเอง นั่นก็คือค่า ชื่อหมวดหมู่เราครับ

หลังจากนั้น ผมใช้คำสั่ง iimDisplay(); ประกาศค่า nameFile ให้โชว์ด้านซ้ายมือกล่องสีเขียวเลยครับ

ตัวอย่างค่าที่ประกาศ iimDisplay
จากการประกาศค่าผมจะได้คำที่เก็บมาแสดงอยู่ที่ด้านซ้ายมือครับ แต่ว่ามันช่องว่างหน้าหลัง จากที่ผมลอง เอาเมาส์ไปครอบดูนะครับ (เราจะแก้ไงดี) วิธีแก้ที่ง่ายที่สุดคือตัดช่องว่าง หน้า-หลัง ของค่าที่เรารับมาครับ นั่นคือ trim() ค่า nameFile ครับผม

var path = "D:\\keeper";

//Check FileName
iimPlay("CODE:\n"
 +"TAG POS=1 TYPE=DIV ATTR=ID:categoryHeader EXTRACT=TXT\n");

var nameFile = iimGetLastExtract();
nameFile = nameFile.trim();
iimDisplay(nameFile);

ผลที่ได้คือ ไมีมีช่องว่างละ
ผลที่ได้จากการตัดช่องว่าง ซ้ายขวา

กฎ ก็คือ กฏครับ การตั้งชื่อไฟล์มันมีกฏของมันครับว่าห้ามใช้เครื่องหมาย นู่นนี่นั่น เยอะแยะมากมายครับ

var nameFile = iimGetLastExtract();
nameFile = nameFile .replace(/[^\w\s-]/g, '').trim().toLowerCase();
nameFile = nameFile .replace(/[-\s]+/g, '-');
iimDisplay(nameFile);

จาก code ด้านบน บรรทัดที่ 2-3 ผมได้ปรับให้สามารถตั้งชื่อได้ครับ

บรรทัดที่ 2 Normalizes string, converts to lowercase, removes non-alpha characters จะเป็นการแปลงค่าตัวหนังสือแปลกๆออกไปโดยการแทนค่าไปครับ และใช้ toLowerCase() เพื่อแปลงเป็นตัวเล็กหมด ยังคงใช้ trim() เพื่อลบช่องว่างหน้าหลังออกด้วยครับ

บรรทัดที่ 3 จะมีช่องว่างที่อยู่ด้านในชื่อ เช่น mens coats jackets ผมก็จับแปลงจากช่องว่างมาให้มีขีดขั้นซะ mens-coats-jackets เท่านั้นครับ

ผลการปรับปรุงเพื่อให้ตั้งชื่อไฟล์ได้
เพียงเท่านี้ผมก็ได้ชื่อไฟล์

** ข้อควรระวัง แล้วถ้าเกิดกรณี Tag ที่เราสั่งเก็บข้อมูลไม่มีข้อมูลให้เราละ ไม่มีชื่อหมวดหมู่ ไม่มี Tag DIV ที่ระบุ ID:categoryHeader ละ เราจะทำอย่างไร 

ผมมองว่า ในเมื่อเรารับค่าที่เก็บค่ามาแล้ว มาไว้ในตัวแปรที่ชื่อ nameFile ที่เอามาแปลงๆนั่นนี่ ผมว่าเราสามารถเอามันไปตรวจสอบได้นะครับ ว่าค่าที่ได้มาเนี่ย ว่างไหม หรือว่า มีข้อมูลอยู่ ใช้ If Else เช็คเอาเลยครับ

ว่าแล้ว ก็จับ If Else เช็คเลยครับ

var nameFile = iimGetLastExtract();
nameFile = nameFile .replace(/[^\w\s-]/g, '').trim().toLowerCase();
nameFile = nameFile .replace(/[-\s]+/g, '-');
 
if(nameFile !== '#EANF#' && nameFile !== '') {
 iimDisplay(nameFile);
}else{
 iimDisplay("ไม่มี");
}

จากด้านบน ผมทำการเช็คค่า nameFile ที่ผ่านการฆ่าเชื้อมาแล้ว เพราะว่าหากไม่มีการเช็คค่าช่องว่าง เราจะไม่สามารถ if หรือเช็คได้ว่าข้อมูลนั่น ว่างจริงๆไหม เนื่องจากเช็คว่ามัน '' ครับ ผมเลยเอาค่าการตรวจสอบออกไปไว้ด้านนอกครับ จะได้ตรงสูตรผม

นี่ได้แค่ชื่อนะครับ ยังไม่ได้ใส่นามสกุลไฟล์ ยังไม่ได้บอกว่าถ้ามันเก็บค่าไม่ได้ตาม if else ที่เราเช็คไว้

ต่อครับ

หลักจากนั้นเราก็ต้องทำตามข้อสงสัยด้านบน คือ เพิ่มนาสกุลไฟล์ และตั้งชื่อไฟล์ให้เขาซะ ผมมีสองทางเลือกสำหรับการตั้งชื่อไฟล์ (กรณี else ไม่เข้าเงื่อนไขนะครับ)

  • ทางเลือกที่ 1 เอาวันที่ มาตั้งเลย อันนี้ สบายเราเลย แต่ก็ไม่รู้ว่ากำลังเก็บอะไรอยู่
  • ทางเลือกที่ 2 เด้งให้เรากรอก นั่นไง ไม่พ้นเราอีกแล้ว
  • ยังมีอีกทางเลือก คือ เอา URL มาตั้งเลย ชื่อจะยาวไปไหม 

เริ่มการเด้ง prompt() รับค่าของ Imacro
อย่างแรกผมทำการเด้งรับค่าก่อนว่าจะกรอกชื่อว่าอย่างไรก่อนครับ

var nameFile = iimGetLastExtract();
nameFile = nameFile.replace(/[^\w\s-]/g, '').trim().toLowerCase();
nameFile = nameFile.replace(/[-\s]+/g, '-');
 
if(nameFile !== 'eanf' && nameFile !== '') {

 nameFile = nameFile + ".csv";
 
}else{

 javascript:nameFile=prompt("Please Enter NameFile:", "");

 if(nameFile !== '' && nameFile !== null) {
  nameFile = nameFile.replace(/[^\w\s-]/g, '').trim().toLowerCase();
  nameFile = nameFile.replace(/[-\s]+/g, '-');
  nameFile = nameFile + ".csv";
 }else{
  var now = new Date();
  nameFile = now + ".csv";
 }
 
}

iimDisplay(nameFile);

** ผมได้เปลี่ยนจากการเช็ค if(nameFile !== '#EANF#' && nameFile !== '') มาเป็น if(nameFile !== 'eanf' && nameFile !== '') เนื่องจาก imacro เก็บค่ามาจะได้ #EANF# ครับ แล้วผ่านการกรองฆ่าเชื้อเรา จะตัดตัวอักษรพิเศษ และ ทำเป็นตัวเล็กด้วย จึงต้องเปลี่ยนครับ

ในบรรทัดที่ 11  ผมใช้คำสั่ง javascript:nameFile=prompt() โดยกำหนด nameFile เพื่อรับค่าที่จะกรอกมานะครับ

หลังจากที่เด้งรับค่า nameFile มาแล้วผมก็จะเช็คอีกครั้งว่าเด้งแล้วกรอกชื่อไฟล์ให้ผมไหม หากไม่กรอกแล้วกด ok เลยนี่ โปรแกรมจะมองว่าเป็น null ครับ ต้องเช็คค่าว่าเป็น null ด้วยนะครับ

หลังจากที่รับค่ามาแล้วก็ฆ่าเชื้อก่อนกำหนดเป็นชื่อไฟล์อีกครั้งในบรรทัด 14 15 16 ครับ แล้วเติมนามสกุลไฟลครับ

หากไม่ตรงตามเงื่อนไข ผมก็จะตั้งชื่อเป็นวันที่ละ โดยประกาศค่า var now = new Date(); ครับ แล้วเอาค่า now มาเป็นชื่อแทนเลย

ชื่อไฟล์ที่ตั้งเป็น now จะเป็นช่วงเวลานั้นๆ
นี่เป็นเพียงการกำหนดชื่อไฟล์ที่ครอบคุมเท่านั้นเองนะครับนี่ หากเป็นเว็บอื่นก็ต้องเปลี่ยนตามการเก็บข้อมูลอีกทีนะครับ

สำเร็จแล้วครับการเช็คชื่อไฟล์ตาม Code JS ด้านล่าง ลองเอาไปปรับปรุงดูครับ

var path = "D:\\keeper";

//Check FileName
iimPlay("CODE:\n"
 +"TAG POS=1 TYPE=DIV ATTR=ID:categoryHeader EXTRACT=TXT\n");

var nameFile = iimGetLastExtract();
nameFile = nameFile.replace(/[^\w\s-]/g, '').trim().toLowerCase();
nameFile = nameFile.replace(/[-\s]+/g, '-');
 
if(nameFile !== 'eanf' && nameFile !== '') {

 nameFile = nameFile + ".csv";
 
}else{

 javascript:nameFile=prompt("Please Enter NameFile:", "");

 if(nameFile !== '' && nameFile !== null) {
  nameFile = nameFile.replace(/[^\w\s-]/g, '').trim().toLowerCase();
  nameFile = nameFile.replace(/[-\s]+/g, '-');
  nameFile = nameFile + ".csv";
 }else{
  var now = new Date();
  nameFile = now + ".csv";
 }
 
}

iimDisplay(nameFile);


เกือบลืมบอกเลยครับตัวนี้ผมเทสและทดสอบที่ร้าน Nordstom นะครับ บอกทันไหมนี่ ฮ่าๆ เรื่องต่อไปน่าจะเป็นเรื่องของการหาจำนวนหน้าอัตโนมัตินะครับ ซึ่งจะคล้ายคลึงกับตัวนี้

หากมีข้อผิดพลาดทักผมทันทีจะได้แก้ไขข้อมูลที่ผมเขียนมานะครับ คนอื่นจะได้อ่านข้อมูลที่ถูกต้องครับ

ขอบคุณทุกท่าที่ติดตามครับ