- ỨNG DỤNG
- Nhập dữ liệu từ Google Sheets 18.0
| Số dòng Code | 2902 |
| Tên kỹ thuật | viin_google_sheet_import |
| Giấy phép | OPL-1 |
| Website | https://viindoo.com/apps/modules/18.0/viin_google_sheet_import |
| Đọc mô tả cho | |
| Yêu cầu các App | Discuss (mail) |
| Bao gồm Các phụ thuộc | Proxy metadata IR an toàn |
The sheet your team already fills in becomes Odoo records, in one go
Sales orders with their products and vendors. Bills of materials with their components. Contacts with their people, tags and bank accounts. One import, not four.
Standard import stops at the first relation
To import a sales order with the standard tool you first import the products, then the vendors, then the order, each from its own file, each prepared by hand. A related record can only be found by name, and a new product gets a name and nothing else: no internal reference, no category, no dimensions. Teams that work from a shared Google Sheet end up keeping the sheet and retyping it into Odoo.
This app reads that sheet directly. A column can point at Order Lines > Product > Vendors > Vendor > Name, and the line, its product and the product's vendor are created from the same row when they do not exist yet, found by the columns you choose when they do.
How it works
1. Describe the sheet once
One configuration per model: the default sheet link, the sheet, the header row, the Google credential and who may run it. Read Columns from Sheet lists every column and pre-fills the field whose name reads the same. The Odoo field is picked from a tree that follows relations, like the one of the custom filters, and offers only the fields an import can write - what Odoo computes itself is left out. Match On columns find existing records; rows sharing the same key become one record with many lines, so a 250-line order is a 250-row sheet.
Per column, only what is needed: a default value, a value mapping for selection fields
(SX = manufacture), a Python expression to compose the value from the row.
Numbers and dates written as text follow your language settings, like the standard import.
2. One policy per related model
Every model the paths reach is listed with its own policy. When not found: create it, leave the field empty, or refuse the row. When found: use it as is, update the columns marked Update, or refuse the row. A product is found by its internal reference and never by a partial name; several matches are reported, never picked silently.
3. Import from the cog menu
Import from Google Sheet appears next to the standard Import records on the list, kanban and form views of every configured model, for the users allowed to run it. The dialog offers the default sheet link, which can be changed on the spot, or an uploaded XLSX/CSV file when there is no Google access.
4. Preview, dry run, import
Preview shows, per record, what will be created, matched, updated or skipped, and the rows in error, without writing. It reads as a tree: the imported record on top, everything it needed beneath it, models named as your team knows them. Dry run really executes the import, constraints and access rights included, then rolls it back. Import writes. Unless you tick Import Valid Rows Only, nothing is written when a single row fails.
The mapping can be adjusted for one session when a sheet differs from the usual one, and an administrator can save the adjusted mapping back to the configuration.
5. Every run is kept
An import session records the mapping it used, its counters, the rows in error and a link to every record it created or updated. Import the same sheet again next week: existing records are matched, only the new rows are created.
6. Google access that nobody has to click through
Paste the JSON key of a Google Cloud service account and share your sheets with its e-mail address, like sharing with a colleague. No OAuth consent screen, no personal account. The key is readable by administrators only and is never sent to the browser. An API key works for public sheets.
Details that matter on a real sheet
- Column headers are matched ignoring case and spacing; inserting a column does not break the mapping.
- Lines may live on a second sheet of the spreadsheet, joined on the header key.
- Numbers stay numbers and dates stay dates whatever the sheet's display locale.
- Numbers and dates typed as text follow your language settings, adjustable per session.
- Yes/no cells understand yes, no, x, 1, 0 and their Vietnamese equivalents.
- Blank rows are ignored; an empty required cell names its row and column.
- Archived records are matched, not duplicated.
- The import runs with the user's own access rights.
- Two hooks let a vertical add-on enrich the values of a node or act after a record is created.
- Runs on Community and Enterprise, without any other paid app.
How we make sure it works
The app ships with 83 automated tests that run on every change: one import creates the company, its contacts, tags and bank; importing the same sheet twice creates nothing twice; several matches are reported, never picked; preview writes nothing; a dry run rolls back but keeps the counters; a failed group does not poison the next one; the secret is readable by managers only; the import runs with the user's rights.
Nhập dữ liệu từ Google Sheets
Hướng dẫn này chỉ cách kết nối Odoo với Google Sheet mà đội của bạn đang dùng, mô tả một lần cách các cột ánh xạ sang một model Odoo, rồi nhập sheet chỉ với ba lần bấm: tải, xem trước, nhập.
Cài đặt
- Vào Ứng dụng.
- Bỏ bộ lọc Ứng dụng mặc định, tìm Nhập dữ liệu từ Google Sheets và bấm Cài đặt. Odoo cài kèm Safe IR Metadata Proxies để người dùng không phải quản trị viên vẫn chọn được model và trường.
Cấu hình
Bước 1 - Kết nối Google
- Trong Google Cloud Console, mở hoặc tạo một dự án và bật Google Sheets API.
- Ở IAM & Admin > Service Accounts, tạo một tài khoản dịch vụ, mở tab Keys và thêm khoá JSON. Một file sẽ được tải về.
- Trong Odoo, vào Nhập từ Sheet > Cấu hình > Tài khoản Google, tạo tài khoản kiểu Khoá tài khoản dịch vụ, dán toàn bộ nội dung file JSON rồi lưu. E-mail của tài khoản dịch vụ hiện trên form.
- Chia sẻ mọi bảng tính cần nhập cho địa chỉ e-mail đó với quyền Người xem.
- Dán link một bảng tính đã chia sẻ vào Sheet để thử và bấm Kiểm tra kết nối: Odoo liệt kê các sheet đọc được.
Tài khoản kiểu API key cũng dùng được, nhưng chỉ với bảng tính chia sẻ cho Bất kỳ ai có link.
Bước 2 - Mô tả ánh xạ
Vào Nhập từ Sheet > Cấu hình > Cấu hình nhập và tạo một cấu hình cho mỗi model và bảng tính.
- Model: các dòng sẽ trở thành gì, ví dụ Đơn bán hàng.
- Link sheet mặc định, Sheet mặc định, Dòng tiêu đề: dữ liệu nằm ở đâu. Người dùng có thể đổi link khi bắt đầu nhập.
- Nhóm được phép: để trống để mọi người dùng Nhập từ Sheet đều chạy được.
Bấm Đọc cột từ sheet: mọi cột ở dòng tiêu đề được liệt kê, và trường Odoo có tên trùng sẽ được điền sẵn. Sau đó hoàn thiện danh sách Cột:
- Tên cột trên sheet là ô tiêu đề, đúng như đã viết (không phân biệt hoa thường và khoảng trắng).
- Trường Odoo được chọn từ cây đi theo quan hệ tới đâu tuỳ ý, ví dụ Chi tiết đơn hàng > Sản phẩm > Mã nội bộ. Mọi model trên đường đi được liệt kê ở Model liên quan. Cột không có trường sẽ bị bỏ qua. Cây chỉ hiện đúng những trường mà nhập chuẩn của Odoo cho phép: trường do Odoo tự tính, trường Odoo tự điền và các trường kỹ thuật của mail đều bị loại, nên trong danh sách không có thứ gì nhập vào cũng không ghi được.
- Khớp theo đánh dấu các cột dùng để tìm bản ghi đã có của model mà cột thuộc về. Ở model được nhập, các dòng có cùng giá trị Khớp theo trở thành một bản ghi nhiều dòng. Ở model liên quan, chúng quyết định sản phẩm, nhà cung cấp hay thẻ đã tồn tại hay chưa.
- Cập nhật đánh dấu cột sẽ ghi lên bản ghi đã có khi chính sách của nó là Cập nhật.
- Các cột tuỳ chọn còn lại: So sánh (chính xác, không phân biệt hoa thường, chứa), giá trị mặc định cho ô trống, bắt buộc, bảng ánh xạ giá trị (SX = manufacture) cho trường lựa chọn, và biểu thức Python với value và row để suy ra hoặc ghép giá trị.
Số và ngày viết dạng chữ được đọc theo thiết lập ngôn ngữ của người dùng, giống nhập chuẩn: dấu thập phân, dấu phân cách hàng nghìn và định dạng ngày. Có thể đổi trên từng phiên nhập ở mục Định dạng. Ô số và ô ngày thật thì không cần gì.
Danh sách Model liên quan cho thấy mọi model mà các cột đi tới và cho chọn, theo từng model:
- Khi không tìm thấy: tạo mới, để trống trường, hoặc báo lỗi dòng đó.
- Khi tìm thấy: giữ nguyên không sửa, cập nhật các cột đã tick Cập nhật, hoặc báo lỗi.
- Thuộc khoá, với quan hệ many2one: tick khi giá trị khác nhau nghĩa là bản ghi phía trên khác nhau. Khác sản phẩm là khác dòng đơn hàng, nên được tick; khác quốc gia không làm thành liên hệ khác, nên bỏ tick. Odoo tick sẵn các quan hệ nằm ngay dưới model được nhập hoặc dưới dòng của nó, và bỏ tick các quan hệ nằm dưới một quan hệ khác.
Dòng ở sheet khác
Một cột có thể ghi tên Sheet trong bảng tính. Sheet đó cũng phải có các cột Khớp theo của model được nhập để các dòng của nó nối được với dòng của sheet mặc định. Đây là cách một đơn hàng và các dòng của nó nằm ở hai sheet.
Sử dụng
- Mở danh sách, kanban hoặc form của model, bấm menu bánh răng và chọn Nhập từ Google Sheet. Mục này chỉ hiện với model có cấu hình mà bạn được phép chạy.
- Xác nhận hoặc đổi link và sheet, hoặc tải lên file XLSX, XLS hay CSV thay thế, rồi bấm Tải. Ô trong file XLSX giữ nguyên kiểu dữ liệu dù sheet hiển thị theo định dạng nào.
- Phiên nhập mở ra. Danh sách Cột cho thấy mọi cột của sheet: cột đã ánh xạ, và các cột mà cấu hình bỏ qua hiện màu xám. Chọn trường để nhập thêm cột; quản trị viên có thể lưu ánh xạ đã chỉnh về cấu hình.
- Bấm Xem trước: Kế hoạch cho thấy, theo từng bản ghi, sẽ tạo, khớp, cập nhật hay bỏ qua gì, và các dòng lỗi. Kế hoạch trình bày dạng cây - bản ghi được nhập nằm trên, những gì nó cần nằm dưới - nên nhìn là biết sản phẩm nào thuộc dòng nào, nhà cung cấp nào thuộc sản phẩm nào. Model hiện theo tên bạn quen dùng, Đơn bán hàng chứ không phải sale.order.
- Bấm Chạy thử: quá trình nhập được thực thi thật, kể cả ràng buộc và quyền, rồi hoàn tác. Không có gì được ghi.
- Bấm Nhập. Trừ khi tick Chỉ nhập dòng hợp lệ, sẽ không ghi gì nếu có dòng lỗi.
Mọi phiên được giữ ở Nhập từ Sheet > Phiên nhập với bộ đếm, ánh xạ đã dùng và link tới bản ghi đã tạo. Nhập lại cùng sheet sẽ khớp với bản ghi đã có thay vì tạo trùng.
Dành cho lập trình viên
Hai móc trên viin.gsheet.import.session cho phép module ngành dọc bổ sung mà không sửa module này:
- _gsheet_prepare_vals(node_path, model_name, vals, row) trả về giá trị để tạo hoặc ghi một bản ghi của một nút (node_path là '' với model được nhập, order_line với dòng của nó, order_line.product_id với sản phẩm của dòng).
- _gsheet_after_create(node_path, record, row) chạy sau khi một bản ghi được tạo.
Ấn bản được Hỗ trợ
- Ấn bản Community
- Ấn bản Enterprise
Phần mềm này và các tệp liên kết ("Phần mềm") được sử dụng (chạy, tuỳ biến, chạy sau khi được tuỳ biến) chỉ khi bạn mua được giấy phép có hiệu lực từ tác giả, điển hình như qua các Ứng dụng Odoo, hoặc trong trường hợp bạn nhận được thoả thuận bằng văn bản từ tác giả của Phần mềm (chi tiết tại tệp COPYRIGHT).
Bạn có thể phát triển các phân hệ Odoo có sử dụng Phần mềm như một Thư viện (thường là phụ thuộc vào, nhập vào và sử dụng nguồn của nó) nhưng không sao chéo bất kỳ mã nguồn hay tài liệu nào thuộc Phần mềm. Bạn có thể phân phối những phân hệ này theo giấy phép mà bạn lựa chọn, miễn sao nội dung giấy phép đó tương tích với điều khoản của Giấy phép Phần mềm Độc quyền Odoo (ví dụ: LGPL, MIT hay bất kỳ loại giấy phép phần mềm độc quyền nào tương tự vậy).
Nghiêm cấm phát hành, phân phối, cấp phép lại hoặc bán bản sao của Phần mềm hoặc bản sao Phần mềm đã được sửa đổi.
Thông báo bản quyền và chấp thuận nêu trên buộc phải được bao gồm trong tất cả các bản sao hoặc các phần quan trọng của Phần mềm.
PHẦN MỀM ĐƯỢC CUNG CẤP "NGUYÊN TRẠNG", KHÔNG BẢO ĐẢM DƯỚI BẤT KỲ HÌNH THỨC NÀO, ĐƯỢC THỂ HIỆN RÕ RÀNG HOẶC NGỤ Ý, KHÔNG GIỚI HẠN ĐẢM BẢO VỀ CÁC BẢO ĐẢM NGỤ Ý VỀ KHẢ NĂNG THƯƠNG MẠI, PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ VÀ KHÔNG VI PHẠM. TRONG MỌI TRƯỜNG HỢP SẼ KHÔNG CÓ TÁC GIẢ HOẶC CHỦ SỞ HỮU BẢN QUYỀN NÀO CHỊU TRÁCH NHIỆM VỀ BẤT KỲ KHIẾU NẠI, THIỆT HẠI HOẶC TRÁCH NHIỆM PHÁP LÝ KHÁC NÀO TRONG PHẠM VI HỢP ĐỒNG, CÁC THIỆT HẠI HOẶC CÁCH KHÁC, PHÁT SINH TỪ, NGOÀI HOẶC CÓ LIÊN KẾT VỚI PHẦN MỀM HOẶC VIỆC SỬ DỤNG HOẶC KINH DOANH KHÁC TẠI PHẦN MỀM.