Các trang tính của Google chia ô nhiều dòng thành các hàng mới (+ trùng lặp các mục hàng xung quanh)


13

Tôi đang biên soạn một cơ sở dữ liệu về thông tin địa chỉ doanh nghiệp, bao gồm nhân viên chủ chốt cho mỗi doanh nghiệp. Bảng tính Google mà tôi đã kế thừa cho dự án này bao gồm một cột cho 'nhân viên chủ chốt' (trong cột B), với nhiều tên nhân viên chính được liệt kê trong cùng một ô, được phân tách bằng dấu ngắt dòng (ví dụ CHAR (10)). Có một doanh nghiệp mỗi hàng. Số lượng dòng trong ô 'nhân viên chính' thay đổi theo từng hàng. Tờ ban đầu của tôi trông như thế này:

nhập mô tả hình ảnh ở đây

Tôi cần làm như sau để tối ưu hóa bảng này:

  1. tách từng ô 'nhân viên chính' nhiều dòng để mỗi tên nhân viên chính xuất hiện trên hàng riêng của nó. Điều này đòi hỏi hàng / s mới được chèn bên dưới hàng ban đầu.
  2. sao chép dữ liệu từ tất cả các ô khác trên hàng ban đầu (nghĩa là từ các cột A & C: E), để mỗi hàng mới chứa dữ liệu đầy đủ cho mỗi doanh nghiệp
  3. Tôi cần một quy trình tự động - Tôi sẽ có khoảng 1000 doanh nghiệp để xử lý vì vậy không thể thực hiện việc này với bất kỳ bước thủ công nào

Tờ này sẽ trông như thế này:

nhập mô tả hình ảnh ở đây

Việc sử dụng =TRANSPOSE(SPLIT(B1,CHAR(10)))rõ ràng chỉ là một phần của cách - nó không chèn các hàng mới và không trùng lặp các mục nhập cột xung quanh. Tất cả giúp đỡ chấp nhận!


Câu trả lời:


13

Trước hết, xin lỗi vì câu trả lời muộn, nhưng tôi có một giải pháp để bạn làm việc cùng.

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Giải thích

Kịch bản đánh giá từng hàng và đặc biệt là cột thứ hai của mỗi hàng (trong mảng JavaScript là không dựa trên, vì vậy cột 2 tương ứng với chỉ mục 1 của mảng). Nó phân chia nội dung của ô đó, thành nhiều giá trị và sử dụng "\n"dấu phân cách (nguồn cấp dữ liệu). Sau đó, nó thêm thông tin hiện có vào một mảng và chỉ thêm các kết quả riêng lẻ, khi nó chạm vào chỉ số 1 ( k == 1). Hàng mới được chuẩn bị sau đó được thêm vào một mảng khác, được trả về để hiển thị kết quả.

Ảnh chụp màn hình

dữ liệu
nhập mô tả hình ảnh ở đây

kết quả
nhập mô tả hình ảnh ở đây

Thí dụ

Tôi đã tạo một tệp ví dụ cho bạn: các ô nhiều dòng thành các hàng mới .
Thêm tập lệnh trong Công cụ> Trình chỉnh sửa tập lệnh và nhấn nút lưu.


2
Tuyệt vời tuyệt vời tuyệt vời - mua cho người đàn ông này một ly bia! Rất cám ơn Jacob, đó chính xác là những gì tôi cần.
tab kirk

2
Và làm thế nào để xác định phạm vi? (nhận thông báo này "không thể đọc thuộc tính" độ dài "từ không xác định" Cảm ơn!
user2060451

trên một tệp thực sự lớn, điều này có thể sẽ thất bại ... kết quả quá lớn.
Kyle Pennell

3

Một giải pháp lặp lại sẽ cần một kịch bản.

Nhưng đối với nỗ lực một lần, bạn chỉ có thể sử dụng =SPLIT(B3,CHAR(10)). Điều này sẽ cung cấp cho bạn tất cả tên của người đó trong các cột trợ giúp bên cạnh, như thế này:

nhập mô tả hình ảnh ở đây

Sao chép / Dán đặc biệt, giá trị nội dung của cột trợ giúp.

Và đối với mỗi cột của trình trợ giúp được sử dụng (hy vọng không quá nhiều, hy vọng bạn không có quá nhiều người trong bất kỳ một doanh nghiệp nào) sao chép và dán thủ công khối hàng vào cuối khối hiện tại. (Đó không phải là một mô tả hay, nhưng bạn có được sự trôi dạt.)


Xin chào Mary, cảm ơn nhưng tôi cần sự chia rẽ. tên người được thả vào ROWS mới, (có thêm hàng được tạo tự động để chứa chúng), sau đó thông tin xung quanh được sao chép bên cạnh các ô của 'người' mới. Và tôi cần một quy trình tự động 100% - tôi không thể thực hiện thủ công cho hàng nghìn doanh nghiệp!
tab kirk

Bạn không cần thực hiện bước thủ công cho cả nghìn doanh nghiệp. Bạn chỉ cần thực hiện với số lượng pepole tối đa được liên kết với bất kỳ một trong số các doanh nghiệp đó: ví dụ: nếu một doanh nghiệp có sáu người, thì sẽ có sáu cột trợ giúp mới được tạo, do đó bạn phải sao chép và dán thủ công Sáu lần, một lần cho mỗi cột.
MaryC.fromNZ

1
Ai đó có thể viết một kịch bản cho việc này (Tôi không phải là ai đó!) - nhưng thực sự thời gian dành cho việc kiểm tra nó có thể sẽ lớn hơn thời gian thực hiện thủ công.
MaryC.fromNZ

2

Đối với những người có thể không ngay lập tức nắm bắt cách sử dụng chức năng tùy chỉnh hữu ích trong câu trả lời được chấp nhận :

  • Bạn cần nhiều hơn một tờ, trong ví dụ hai tờ là DATARESULT. Trang RESULTtính trống cho đến khi truy vấn đã được chạy. Bạn có thể thấy truy vấn đề cập đến DATAtrang tính trong ảnh chụp màn hình của Jacob.

  • Rất có thể bạn sẽ cần sửa đổi giá trị so sánh cho kdòng 8 đề cập đến cột nơi tìm thấy dữ liệu của bạn để phân tích cú pháp. Số tương tự sẽ cần phải đi vào giá trị mảng thứ 2 trên dòng 4.

  • Bạn có thể cần sửa đổi dấu phân cách trên dòng 4 hiện đang \n

Để làm cho tất cả điều này trở nên dễ dàng hơn một chút, tôi đã lấy cùng một mã và trích xuất cột phân cáchcột đích thành các biến được đặt ở đầu hàm. Như Jacob đề cập đến số cột mục tiêu bắt đầu bằng 0 là số đầu tiên.

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Người giới thiệu


1
Nếu tôi chạy mã, nó báo: TypeError: Không thể đọc thuộc tính "độ dài" từ không xác định. cảm ơn bạn rất nhiều. Câu trả lời phải có ở đây: Câu trả lời phải ở đâu đó tại đây (developers.google.com/apps-script/reference/s Lansheet / Lỗi) Nhưng tôi vẫn gặp lỗi tương tự.
dùng2060451

@ user2060451 Giải pháp cho câu trả lời này hiển thị mã của hàm tùy chỉnh, nó không có ý định được chạy từ trình chỉnh sửa tập lệnh. Tôi đã thêm một liên kết đến hướng dẫn chức năng tùy chỉnh từ Google.
Rubén
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.