Google ชีต- คอลัมน์ค้นหาแบบวนซ้ำ เลือกลาก

ฉันมีสเปรดชีตของ Google ที่ฉันมีปัญหาสุดท้ายที่ดูเหมือนจะแก้ไขไม่ได้

ฉันเพิ่มปุ่มให้กับสคริปต์นี้ และเมื่อฉันกดปุ่ม มันจะทริกเกอร์ฟังก์ชัน AddClient

ฉันจะทำให้สคริปต์ด้านล่างวนซ้ำแถวทั้งหมดในคอลัมน์ 3 ค้นหาค่าใช่ได้อย่างไร เมื่อพบแล้ว ให้คัดลอกแถวด้านล่างไปยังแผ่นงาน "ไคลเอนต์" แล้วหยุด

function AddClient(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "SETUP" && r.getColumn() == 3 && r.getValue() == "yes")     {
    var row = r.getRow() + 1; // Add 1 to the active row
    var targetSheet = ss.getSheetByName("client");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 2, 1, 4).copyTo(target,  {contentsOnly:true}); //Only selecting column 2, then the following 4 columns
  }
}

แก้ไข* ตัวอย่างเอกสาร: https://docs.google.com/spreadsheets/d/1DFbAp0IN8_UFv9u8kWiZBTxDogj4e7FnuAPzC0grDw0/edit?usp=sharing

ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก!

ไชโย, เรียล


person Latent-code    schedule 04.04.2017    source แหล่งที่มา
comment
การโต้ตอบที่คุณพยายามออกแบบคืออะไร? มีคนป้อนใช่ในคอลัมน์ที่สามและแถวนั้นถูกคัดลอกไปยังแผ่นงานอื่นใช่ไหม   -  person Robin Gertenbach    schedule 04.04.2017
comment
ขออภัย ตอนนี้ฉันไม่ค่อยชัดเจน คุณมีปุ่มเดียวและสคริปต์จะคัดลอกทุกอย่างด้วยใช่หรือจะมีใช่ทุกที่และคุณมีปุ่มสำหรับทุกแถวหรือไม่   -  person Robin Gertenbach    schedule 04.04.2017
comment
บางทีภาพหน้าจอหรือสเปรดชีตตัวอย่างที่ดียิ่งกว่านั้นอาจช่วยได้   -  person Robin Gertenbach    schedule 04.04.2017
comment
ขออภัยที่ไม่ได้เคลียร์อะไร :P ฉันแก้ไขอีกครั้ง เพิ่มเอกสารตัวอย่างที่เหมือนกับของฉันทุกประการ แต่มีชื่อข้อมูลต่างกัน   -  person Latent-code    schedule 04.04.2017
comment
ขอบคุณที่ทำให้มันง่ายขึ้นมาก โปรดดูคำตอบของฉัน   -  person Robin Gertenbach    schedule 04.04.2017


คำตอบ (1)


  • เนื่องจากคุณมีรูปแบบคงที่ ตำแหน่งของข้อมูลที่จะคัดลอกจะไม่เปลี่ยนแปลง
  • เนื่องจากเรารู้ว่าเราต้องการคัดลอกข้อมูล เราจึงไม่จำเป็นต้องตรวจสอบจุดที่เราอยู่ เพื่อให้ข้อมูลทั้งหมดสามารถไปต่อได้
  • ชีตมีเมธอด appendRow ที่ดูแลการทำบัญชีที่เกี่ยวข้องกับการค้นหาแถวสุดท้าย

สิ่งนี้ช่วยให้เราลดความซับซ้อนของสคริปต์ดังต่อไปนี้:

function AddClient() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getSheetByName("SETUP").getRange(25, 2, 1, 4).getValues()[0];
  ss.getSheetByName("client").appendRow(data);
}

แก้ไข: หากต้องการลบรายการที่ซ้ำกัน คุณสามารถทำสิ่งต่อไปนี้:

function AddClient() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getSheetByName("SETUP").getRange(25, 2, 1, 4).getValues()[0];
  var clients = ss.getSheetByName("client").getDataRange().getValues();

  if (!clients.filter(function(row) {return data.join("|") === row.join("|");})) {
    ss.getSheetByName("client").appendRow(data);
  }  
}

โปรดทราบว่าในตัวอย่างนี้มีปัญหาบางประการเนื่องจากศูนย์นำหน้าถูกตัดออก ชีตค่อนข้างแปลกและบางครั้งก็พยายามบังคับให้รูปแบบเป็นตัวเลขแม้ว่าคุณจะตั้งค่ารูปแบบของเซลล์เป็นข้อความ...

person Robin Gertenbach    schedule 04.04.2017
comment
วิธีแก้ปัญหาที่ดีมาก เนื่องจากฉันเปลี่ยนทิศทางโดยกดปุ่มไปครึ่งทาง ฉันจึงมีความคิดว่ามันสามารถปรับให้เหมาะสมได้มาก .. ขอบคุณมาก! เป็นไปได้ไหมที่จะตรวจสอบรายการสองเท่าและแก้ไขรูปแบบของเอาต์พุต - person Latent-code; 04.04.2017
comment
ขอขอบคุณที่สละเวลาช่วยในเรื่องนี้! สคริปต์ที่คาดว่าจะตรวจจับรายการซ้ำไม่ทำงาน มันไม่ได้ผนวกข้อมูลใหม่ด้วยซ้ำ นอกจากนี้ เมื่อฉันใช้: '.copyTo(target, {contentsOnly:true})' the contentsOnly แก้ไขการจัดรูปแบบให้ฉันเท่านั้น.. นั่นเป็นทางออกที่ดีกว่าในการบรรลุสิ่งที่ฉันต้องการหรือไม่ เนื่องจากนี่เป็นการเสนอราคาสำหรับลูกค้า การจัดรูปแบบจึงค่อนข้างสำคัญ อาจจะเป็นเช่นนั้นมากที่สุดสำหรับ 0 ในรหัสไปรษณีย์ - person Latent-code; 04.04.2017