Google Sheet và những thứ hay ho

Giới thiệu Bài toán đặt ra Ở đây tôi có một sheets tổng có tên là Master và từ sheet này tôi muốn điều khiển các sheets khác để có thể thêm người dùng vào các sheets mà có đường link ở sheet Master ở chế đệ Editor hoặc chế độ Viewer. Setup bài toán

Giới thiệu

Bài toán đặt ra

Ở đây tôi có một sheets tổng có tên là Master và từ sheet này tôi muốn điều khiển các sheets khác để có thể thêm người dùng vào các sheets mà có đường link ở sheet Master ở chế đệ Editor hoặc chế độ Viewer.

Setup bài toán ở trên

1. Tạo một Google Sheets trên Google Driver

Ở đây tôi đặt tên cho sheets này là Google Sheet Demo bạn có thể đặt tên gì tuỳ thích.

2. Tạo một folder

Ở đây tôi tạo folder để dễ quản lý các sheets ở trong này tôi tạo mẫu 2 sheets có tên là Sheet1Sheet2.

3. Cập nhật dữ liệu

Với Master sheets ở đây tôi sẽ bỏ tên và id của sheets ở trong Master sheets (mục đích là để nó biết được đường dẫn chính xác của sheets nó muốn thực hiện một thứ gì đó).

4. Tạo sheets

Tạo sheets có tên Add Email ở trong Google Sheet Demo ở đây nó sẽ gồm có 2 cột là EditorViewer mục đích để khi ta thêm email của người nào vào cột nào thì nó sẽ cập nhật chế độ quản lý của người đó ở 2 trên kia.

Demo

Để truy cập vào Google Script App ta thực hiện các bước sau:

1. Từ Google Sheet Demo ta chọn vào phần Tools nằm trong ở navbar.

2. Sau đó click vào dòng thứ 3 Script editor.

3. Hiển thị hình ảnh giao diện để ta có thể viết script điều khiển sheets (dưới đây là hình ảnh).

Thực hiện code

Code.gs
functionmyFunction(){const fileId = SpreadsheetApp.getActiveSpreadsheet().getId();// Dùng để lấy đc ID của google sheetsconst addEmailSheets = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Add Email");// Lấy được ra sheets có tên Add Emailconst data = addEmailSheets.getDataRange().getValues();// Lấy tất cả dữ liệu trong sheets đó với 1 dòng tương ứng một mảngconst editorUser =[];const viewerUser =[];for(let i =1; i < data.length; i++){if(data[i][0]){// Ở dây vì email editor tôi thêm ở cột A là nó tương ứng với vị trí thứ 0 trong mảng
      editorUser.push(data[i][0]);}if(data[i][1]){// Tương tự như ở trên ở dây vì email viewer tôi thêm ở cột B là nó tương ứng với vị trí thứ 1 trong mảng
      viewerUser.push(data[i][1]);}}const masterSheet = SpreadsheetApp.openById(fileId).getSheetByName("Master");// Lấy gì trị sheets Masterconst projects = masterSheet.getDataRange().getValues();// Get tất dữ liệu trong sheets Master cũng như trên tương ứng mỗi dòng là một phần tử mảngconstreducer=(acc, email)=>({...acc,[email]: email });// Hàm này tôi viết để dùng chung khi thêm email nào đó vào sheetsfor(let i =1; i < projects.length; i++){const sheet = SpreadsheetApp.openById(projects[i][1]);// Mở Sheet 1 từ file ID của nó trên sheets Masterconst getUserEditors = sheet.getEditors().length // Kiểm tra xem trong Sheet 1 có tồn tại email nào chưa, nếu có lấy email đó ra.? sheet.getEditors().map((user)=> user.getEmail()): sheet.getEditors();if(editorUser.length){const obj = editorUser.reduce(reducer,{});// Ở đây tôi sử dụng hashmap để lưu email theo dạng key, value
      getUserEditors.forEach((item)=>{// Kiểm tra xem trong Sheet 1 nếu có email trong đó mà giống với email thêm vào thì xoá email trong đó điif(item == obj[item]){delete obj[item];}});const editorUsersClean = Object.keys(obj);// Chuyển tất cả email đã làm sạch từ ở trên về một mảngif(editorUsersClean.length){
        sheet.addEditors(editorUsersClean);// Dùng để thêm tất cả email từ biến editorUsersClean vào sheet}}if(viewerUser.length){// Tương tự như editor ở trênconst findUserEditors = viewerUser.filter((user)=>
        getUserEditors.includes(user));if(findUserEditors.length){for(let i =0; i < findUserEditors.length; i++){
          sheet.removeEditor(findUserEditors[i]);}}const getUserViewer = sheet.getViewers().length
        ? sheet.getViewers().map((user)=> user.getEmail()): sheet.getViewers();const obj = viewerUser.reduce(reducer,{});
      getUserViewer.forEach((item)=>{if(item == obj[item]){delete obj[item];}});const viewerUsersClean = Object.keys(obj);if(viewerUsersClean.length){
        sheet.addViewers(viewerUsersClean);}}}}

Kết quả sau khi chạy hàm trên sẽ thêm đc email đó vào tất cả sheets ở trong Master

Cronjob của Google Script

Thay vì mỗi lần thêm email vào chúng ta phải đi vô “run” hàm một cách thủ công thì ta nên để cho Google Script sẽ chạy tự động bao lâu ở đây tôi sẽ cho nó chạy 1 tiếng 1 lần cùng xem nhé.

1. Di chuột vào thanh sidebar bên trái chọn Trigger

2. Click vào button Add Trigger(màu xanh) phía mép bên phải

3. Thêm các tuỳ chọn như hình

4. Hoàn thành và thấy được hàm trigger

Link của demo các bạn có thể truy cập

Kết luận

Hi vọng từ ví dụ trên các các bạn có thể biết thêm những thứ hay ho của Google nói chung và Google Sheets nói riêng.

Lưu ý: Nếu người dùng đang ở trạng thái Viewer thì bạn có thể chuyển qua Editor mà không cần xoá email đó khỏi sheets nhưng nếu từ Editor mà chuyển qua Viewer thì mình hiện tại phải xoá email đi rồi cập nhật trạng thái Viewer cho sheets(theo document của Google). Nếu bạn có cách nào hay hơn hoặc tốt hơn có thể comment phái dưới.

Cảm ơn các bạn đã đọc hết bài viết.

Nguồn: viblo.asia

Bài viết liên quan

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th

Những ngành nghề AI có thể thay thế dần trong tương lai.

Những ngành nghề AI có thể thay thế trong tương lai gần Dựa trên các báo cáo và

Tạo Subdomain miễn phí với is-a.dev 🤪

Cuối tuần mọi người thế nào, mình thì rảnh quá lướt Facebook, tớ tình cờ th

Dùng TailwindCSS v4 trong SpringBoot + JTE

Giới thiệu JTE là gì? JTE (Java Template Engine) là một template engine an toàn, nhẹ và