Gặp vấn đề khi thay avatar từ url khi tạo danh bạ bằng Google App Script và Google Contacts

Chào mọi người. Mình có 1 vấn đề như thế này mong mọi ngươi giúp đỡ với nha.
Ví dụ mình có 1 list data khách hàng. Trong đó bao gồm Họ tên > Sđt> Địa chỉ > Url chứa hình ảnh khách hàng. Mình dùng Google App Script (GS) để tạo danh bạ lên google contact. Vấn đề tạo danh bạ thì mình đã làm chạy ok, nhưng trong lúc tạo danh bạ mình muốn update luôn avata từ url thì lại báo lỗi, Mong mọi người giúp đỡ mình với. Đây là code của mình

function addPhotocontact() {
  var contact = ContactsApp.createContact("nguyen văn" , "a", "[email protected]");
  contact.addPhone(ContactsApp.Field.WORK_PHONE,'0123456754689');
  var contactid = contact.getId();
  var hinh = 'https://cdn-images.kiotviet.vn/dienmaythanhvong/avatar-0aebe69212a1450699375243f2c5cb1e.jpg';
  var param = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    followRedirects : true,
    muteHttpExceptions:true
  };
  var url = UrlFetchApp.fetch(hinh);
  var blob = url.getBlob();
  var data = Utilities.base64EncodeWebSafe(blob.getBytes());
  var uphinh = People.People.updateContactPhoto(contactid,data)
};

Đầu tiên, muốn sửa lỗi phải nêu lỗi đó là gì ra mới biết mà sửa. Thứ hai:

Chỗ này có gì đó sai sai thì phải :thinking: ?
https://developers.google.com/people/api/rest/v1/people/updateContactPhoto

3 Likes

Bạn có thể giúp mình khắc phục được không?

Đầu tiên, bạn cần phải nêu rõ lỗi mà bạn gặp là gì.

3 Likes

Khi mình chạy update avata thì trên GS lại báo lỗi như thế này ạ.

À, code của bạn đang bị lỗi 413 Request Entity Too Large (413 Payload Too Large). Lỗi này đơn giản là do request có dung lượng cao hơn giới hạn mà server quy định, cụ thể hơn là do dung lượng ảnh. Bạn phải chỉnh sửa lại kích thước ảnh về cỡ 96px x 96px

Cách chỉnh kích thước ảnh bằng App Script:
https://developers.google.com/apps-script/reference/slides/image#setHeight(Number)
https://developers.google.com/apps-script/reference/slides/image#setWidth(Number)

2 Likes

Cho mình hỏi là mình nên resize ảnh trước hay là chuyển rồi mới resize.

Resize ảnh trước nha bạn, có thể dùng App Script hoặc resize, chỉnh sửa bên ngoài. À mà chỉnh xuống 96px x 96px nha.

2 Likes

Mình có đọc tài liệu thì chưa thấy resize từ url, chỉ có thấy resize từ google driver

Có hàm replace() có thể thực hiện chức năng mà bạn cần:
https://developers.google.com/apps-script/reference/slides/image?hl=en#replace(String)

2 Likes

bạn có thể xem lại giúp mình không. Vì hàm replace trong gs mình không thấy có hỗ trợ

Xem kĩ lại thì class Image nó lại nằm trong Google Slides thành ra là phải thêm Slides ở đầu và thêm scopes :slightly_smiling_face::
https://www.googleapis.com/auth/presentations.currentonly
https://www.googleapis.com/auth/presentations
https://developers.google.com/apps-script/concepts/scopes#setting_explicit_scopes

3 Likes

Mình đã thử thì Slides nó chỉ hỗ trợ resize trên trang đó thôi,nó không hỗ trợ được resize khi đã bob

Dùng blob à, nhớ có hàm này chuyển blob sang Image mà, chuyển xong rồi thì resize ảnh thôi:
https://developers.google.com/apps-script/reference/slides/image?hl=en#replaceblobsource

2 Likes

Bạn có thể giúp mình code đoạn này được không? Vì mình chuyển qua không được

const image_url = 'https://cdn-images.kiotviet.vn/dienmaythanhvong/avatar-0aebe69212a1450699375243f2c5cb1e.jpg'
let image = SlidesApp.getActivePresentation().getSlides()[0].getImages()[0];
image.replace(UrlFetchApp.fetch(image_url).getBlob())
/*
Ghi luôn thế này cho nhanh:
image.replace(image_url)
*/
//Sửa size ảnh...
var base64_data = Utilities.base64EncodeWebSafe(image.getBlob().getBytes());
2 Likes

Tks bạn. Cách này mình đã thử rồi, nhưng mình đã cấp full quyền khi chạy rồi nhưng báo lỗi không đủ quyền khi chạye95755b548b3b4ededa2
Còn đây là những quyền mình đã cấp
fd8c7f2b602d9c73c53c

Giờ mình mới nhận ra là chưa tạo Slide thì lấy đâu ra slide mà dùng :joy:

const image_url = 'https://cdn-images.kiotviet.vn/dienmaythanhvong/avatar-0aebe69212a1450699375243f2c5cb1e.jpg'
let presentation = SlidesApp.create('Ảnh');
let slide = presentation.appendSlide()
let image_slide = slide.insertImage(imageUrl)
// Sửa size ảnh các thứ...
let base64_data = Utilities.base64EncodeWebSafe(image_slide.getBlob().getBytes())

Mà khoan, đã là một Javascript dev thì phải biết null là cái gì chứ nhỉ. Lỗi đó mà là không đủ quyền chạy à :rofl:, dịch tí tiếng Anh cũng biết đây là lỗi: “Không thể đọc thuộc tính getSlide() của null” (null có gì đâu mà đọc, tương tự undefined)

P/s: getSlide() là method chứ không phải là thuộc tính, cái này do Javascript hơi dở hơi chút

3 Likes

chuyển qua chạy bên Slide chạy thì resize được nhưng phát sinh 1 vấn đề là Slide lại không hỗ trợ People để update avatar.

Ủa, là sao :thinking: ? Trong đoạn code trên mình tạo một presentation => Tạo slide trong presentation đó => Chèn ảnh vào slide => Resize ảnh đó (tự bạn thêm vào) và chuyển ảnh đó thành Base64. Mà chẳng phải ảnh cần upload ở dạng Base64 à :thinking: ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?