Beberapa/Duplikat Baris Dengan Kunci Unik

Di Google Sheets, menggunakan Apps Script, saya memiliki 3 lembar yang ingin saya ambil kunci dari lembar 1 dan menduplikasi baris dari lembar 2 pada lembar tersebut sehingga untuk setiap kunci unik, setiap nilai dari lembar 2 terisi. Lihat lembar 3 sebagai contoh keluaran. Perhatikan bagaimana di lembar 1, kunci hanya muncul sekali, tetapi saya memerlukan kunci untuk menduplikasi agar sesuai dengan jumlah baris dari lembar 2.

Ada ide?

Lembar 1: Berisi kunci unik

Lembar 2: Berisi nilai yang ingin saya kalikan/duplikasi

Lembar 3: Berisi keluaran yang diinginkan.

lembar 1

lembar 2

lembar 3


person Bava    schedule 11.03.2019    source sumber
comment
Tunjukkan kode Anda sejauh ini.   -  person TheMaster    schedule 11.03.2019


Jawaban (2)


Untuk 2 col dari Sheet2, gunakan ini -

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
Sempurna! Saya terlalu memikirkan hal ini. Jauh lebih sederhana cara Anda melakukannya. - person Bava; 13.03.2019

Anda dapat membaca kolom Kunci dan Nilai dan menggunakan nilai tersebut untuk membuat baris yang dapat ditulis untuk Sheet3. Kode di bawah ini menunjukkan pendekatan sederhana untuk melakukan ini di dalam fungsi test yang dapat Anda salin/tempel dan jalankan.

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);
}

Lihat ini untuk map, ini untuk forEach, ini untuk SpreadsheetApp dan ini untuk sheet.

person ra89fi    schedule 11.03.2019
comment
Cemerlang! Itulah yang saya inginkan! Terima kasih. - person Bava; 12.03.2019
comment
Saya sedang berupaya memperluas kode yang Anda berikan untuk memasukkan kolom tambahan dari lembar 2. Misalnya, saya ingin memasukkan kolom 1 dan 2 dari lembar 2, bukan hanya kolom 1. Namun, menurut saya perubahan ini tidak seintuitif Saya mengharapkan. Saya menambahkan kode di bawah ini, lalu memperluas s3.gerRange menjadi 3 kolom. Namun, hal ini menduplikasi hasilnya. // baca kolom Nilai, [ [nilai], [nilai], [nilai]... ] var v3 = s2.getRange(2, 1, s2.getLastRow() - 1, 3).getValues(); // meratakan array dari array ke dalam array, [nilai, nilai...] v3 = v3.map(function(el) { return el[1]; }); - person Bava; 13.03.2019
comment
@bava Jangan bertanya lagi di komentar. Jika penelitian dan eksperimen yang memadai tidak menyelesaikan masalah yang Anda alami, ajukan pertanyaan baru yang spesifik agar kerja keras Anda dapat tersampaikan dengan baik. Bertanya dalam komentar selalu membuat seolah-olah Anda sendiri tidak berusaha keras (walaupun Anda melakukannya). - person tehhowch; 13.03.2019