Skip to content

Dashboard

Upload to Drive and convert to Workspace format using Apps Script

Created by Admin

Nếu tất cả file đều được tạo trên Google Drive và chỉnh sửa bằng trình duyệt thì rất tuyệt vời. Tuy nhiên, nhiều người vẫn có thói quen sử dụng bộ công cụ Office của Microsoft để chỉnh sửa offline, sau khi hoàn thành thì tải lên Google Drive để lưu trữ.

Thông thường, để tải lên Google Drive, chúng ta có thể sử dụng giao diện người dùng mặc định của phần mềm, việc tải lên rất đơn giản với giao diện kéo thả của Google Drive. Trường hợp chúng ta cần track hoạt động upload thì có thể copy link file vừa tải lên và ghi vào 1 spreadsheet.

Việc copy link có thể thực hiện thủ công một cách nhanh chóng, nhưng nếu chúng ta muốn việc này được thực hiện tự động mỗi lần upload file thì có thể sử dụng Apps Script. Chúng ta sẽ viết một sidebar với thẻ input để bắt sự kiện upload và ghi thông tin của file vào sheet. Bên cạnh đó, Google Drive không tính dung lượng đối với các file thuộc định dạng Google Workspace nên chúng ta sẽ chuyển đổi sang định dạng Google Workspace cho tiết kiệm dung lượng miễn phí. Xem thành quả qua file gif bên dưới (click vào ảnh nó mới động đậy).

Custom menu

Trước tiên chúng ta sẽ thêm nút nhấn để khởi chạy sidebar vào menu bar.

// File Code.gs

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Upload')
    .addItem('Start', 'showSidebar')
    .addToUi();
}

function showSidebar() {
  let html = HtmlService.createHtmlOutputFromFile('Index.html');
  SpreadsheetApp.getUi().showSidebar(html);
}

Custom menu

Sidebar

Sidebar chỉ gồm một thẻ inputvà bắt đầu upload file khi có sự kiện onchange. File được đọc theo kiểu byte array để thuận tiện trong việc tạo blob ở server, hoặc dùng để chuyển đổi định dạng trong trường hợp này.

<!-- File Index.html -->
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <!-- This CSS package applies Google styling; it should always be included. -->
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
    <div class="sidebar">
      <h3>Upload your file</h3>
      <input id="file" type="file" onchange="handleUpload(this)">
      <div id="output"></div>
    </div>

    <script>
      function handleUpload(f) {
        let input = document.getElementById('file');
        input.disabled = true;
        let fr = new FileReader();
        let file = f.files[0]

        fr.onload = function(e) {
          const obj = {
            name: file.name,
            type: file.type,
            bytes: [...new Int8Array(e.target.result)]
          }
          google.script.run
            .withFailureHandler(onUploadFailure)
            .withSuccessHandler(onUploadSuccess)
            .uploadFile(obj)
        }
        fr.readAsArrayBuffer(file);
      }

      function onUploadSuccess() {
        let input = document.getElementById('file');
        input.disabled = false;
        input.value = '';
      }

      function onUploadFailure(error) {
        let output = document.getElementById('output');
        output.innerHTML = 'ERROR: ' + error.message;
      }
    </script>
  </body>
</html>

Tham khảo Tanaikech

Server

Ở phía server thì chúng ta sẽ viết hàm uploadFile để tải file. Chúng ta có thể sử dụng class DriveApp để tạo file trên Google Drive nhưng mục đích của chúng ta là phải chuyển đổi định dạng sang định dạng của Google nên trường hợp này chúng ta phải sử dụng Drive API và gọi thông qua UrlFetchApp.

function uploadFile(e) {
  const folderId = '1rV-xVAmmR0skgJ5JcsRK-u1TF1clCKBR';
  const folder = DriveApp.getFolderById(folderId);

  const convertedFile = JSON.parse(UrlFetchApp.fetch(
    "https://www.googleapis.com/upload/drive/v2/files?uploadType=media&convert=true",
    {
      method: "POST",
      contentType: e.type,
      payload: e.bytes,
      headers: {
        "Authorization" : "Bearer " + ScriptApp.getOAuthToken()
      },
      muteHttpExceptions: true
    }
  ).getContentText());

  const newFile = DriveApp.getFileById(convertedFile.id);
  newFile.moveTo(folder);
  SpreadsheetApp.getActive().toast('File created.');
  newFile.setName(e.name);
  appendToSheet(newFile);
}

function appendToSheet(file) {
  let row = [
    new Date(),
    file.getName(),
    file.getMimeType(),
    file.getUrl()
  ]
  let sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow(row);
}

Trong đoạn code chuyển đổi định dạng ở trên, mình tham khảo từ Labnol, sử dụng Drive API phiên bản 2, nhưng bây giờ Google đã ra phiên bản 3. Bạn nào biết cách chuyển lên phiên bản 3 thì comment giúp mình nhé.

Source: https://viblo.asia/p/upload-to-drive-and-convert-to-workspace-format-using-apps-script-maGK7Gv9Kj2