หลายแถว/ซ้ำกันโดยใช้คีย์เฉพาะ

ใน Google ชีตโดยใช้ Apps Script ฉันมี 3 ชีตซึ่งฉันต้องการนำคีย์จากชีต 1 และทำซ้ำแถวจากชีต 2 เทียบกับคีย์เหล่านั้น เพื่อให้ทุกคีย์ที่ไม่ซ้ำกัน ทุกค่าจากชีต 2 จะถูกเติมเข้าไป ดูแผ่นที่ 3 เป็นตัวอย่างผลลัพธ์ สังเกตว่าในชีต 1 คีย์จะปรากฏเพียงครั้งเดียว แต่ฉันต้องการให้คีย์ทำซ้ำเพื่อให้ตรงกับจำนวนแถวจากชีต 2

มีความคิดอะไรบ้าง?

แผ่นงาน 1: ประกอบด้วยคีย์เฉพาะ

แผ่นงาน 2: มีค่าที่ฉันต้องการคูณ/ทำซ้ำ

แผ่นงาน 3: ประกอบด้วยผลลัพธ์ที่ต้องการ

แผ่นที่ 1

แผ่นที่ 2

แผ่นที่ 3


person Bava    schedule 11.03.2019    source แหล่งที่มา
comment
แสดงรหัสของคุณจนถึงตอนนี้   -  person TheMaster    schedule 11.03.2019


คำตอบ (2)


สำหรับ 2 คอลัมน์จาก Sheet2 ให้ใช้สิ่งนี้ -

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName('Sheet1');
  var s2 = ss.getSheetByName('Sheet2');
  var s3 = ss.getSheetByName('Sheet3');

  // read Key column, [ [value], [value], [value]... ]
  var v1 = s1.getRange(2, 1, s1.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v1 = v1.map(function(el) {
    return el[0];
  });
  // read 2 columns, [ [value1, value2], [value1, value2], [value1, value2]... ]
  var v2 = s2.getRange(2, 1, s2.getLastRow() - 1, 2).getValues();

  // hold rows to insert, will become [row, row]
  var result = [];

  v1.forEach(function(k) {
    v2.forEach(function(v) {
      // create row as [k, v1, v2]
      // change needed here if Sheet3 row has to be combo of Sheet2 cols
      result.push([k].concat(v));
    });
  });

  // get range of required length and insert values into sheet
  // 2, which row to start, 1, which col to start, result.length, how many rows, 2, how many cols
  s3.getRange(2, 1, result.length, 3).setValues(result);
}
person ra89fi    schedule 13.03.2019
comment
สมบูรณ์แบบ! ฉันคิดมากไปกว่านี้ ง่ายกว่ามากในแบบที่คุณทำ - person Bava; 13.03.2019

คุณสามารถอ่านคอลัมน์คีย์และค่า และใช้ค่าเพื่อสร้างแถวที่เขียนได้สำหรับ Sheet3 โค้ดด้านล่างแสดงวิธีง่ายๆ ในการดำเนินการนี้ภายในฟังก์ชัน test ที่คุณสามารถคัดลอก/วางและเรียกใช้ได้

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName('Sheet1');
  var s2 = ss.getSheetByName('Sheet2');
  var s3 = ss.getSheetByName('Sheet3');

  // read Key column, [ [value], [value], [value]... ]
  var v1 = s1.getRange(2, 1, s1.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v1 = v1.map(function(el) {
    return el[0];
  });
  // read Values column, [ [value], [value], [value]... ]
  var v2 = s2.getRange(2, 1, s2.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v2 = v2.map(function(el) {
    return el[0];
  });

  // hold rows to insert, will become [row, row]
  var result = [];

  v1.forEach(function(k) {
    v2.forEach(function(v) {
      // create row as [k, v]
      result.push([k, v]);
    });
  });

  // get range of required length and insert values into sheet
  // 2, which row to start, 1, which col to start, result.length, how many rows, 2, how many cols
  s3.getRange(2, 1, result.length, 2).setValues(result);
}

ดู สิ่งนี้ สำหรับ map, สิ่งนี้ สำหรับ forEach, สิ่งนี้ สำหรับ SpreadsheetApp และ สิ่งนี้ สำหรับ sheet

person ra89fi    schedule 11.03.2019
comment
ฉลาดหลักแหลม! นั่นคือสิ่งที่ฉันต้องการ! ขอบคุณ - person Bava; 12.03.2019
comment
ฉันกำลังดำเนินการเพื่อขยายโค้ดที่คุณระบุเพื่อรวมคอลัมน์เพิ่มเติมจากแผ่นงาน 2 ตัวอย่างเช่น ฉันต้องการรวมคอลัมน์ 1 และ 2 จากแผ่นงาน 2 แทนที่จะรวมเฉพาะคอลัมน์ 1 อย่างไรก็ตาม ฉันพบว่าการเปลี่ยนแปลงนี้ไม่เป็นไปตามสัญชาตญาณ ฉันคาดหวัง. ฉันเพิ่มโค้ดด้านล่าง จากนั้นขยาย s3.gerRange เป็น 3 คอลัมน์ อย่างไรก็ตาม นี่เป็นการทำซ้ำผลลัพธ์ // อ่านคอลัมน์ค่า [ [value], [value], [value]... ] var v3 = s2.getRange(2, 1, s2.getLastRow() - 1, 3).getValues(); // แผ่อาร์เรย์ของอาร์เรย์ออกเป็นอาร์เรย์ [value, value...] v3 = v3.map(function(el) { return el[1]; }); - person Bava; 13.03.2019
comment
@bava อย่าถามคำถามเพิ่มเติมในความคิดเห็น หากการวิจัยและการทดลองที่เพียงพอไม่สามารถแก้ไขปัญหาที่คุณประสบได้ ให้ถามคำถามใหม่ที่เฉพาะเจาะจงซึ่งสามารถถ่ายทอดการทำงานหนักของคุณสามารถถ่ายทอดได้อย่างเหมาะสม การถามความคิดเห็นมักจะทำให้ดูเหมือนว่าคุณไม่ได้พยายามตัวเองอย่างหนัก (แม้ว่าคุณจะพยายามก็ตาม) - person tehhowch; 13.03.2019