sanom sanom Author
Title: แสดงรายการไฟล์ใน Google Drive บน GoogleSheet
Author: sanom
Rating 5 of 5 Des:
 โค้ด Appscript สำหรับแสดงรายการไฟล์ต่างๆที่อัพโหลดใน google drive บน google sheet    // =============================================== // ...

 โค้ด Appscript สำหรับแสดงรายการไฟล์ต่างๆที่อัพโหลดใน google drive บน google sheet   


// ===============================================

// Drive → Sheet file lister with Preview (fit to cell) & menu

// ===============================================


// (ใส่หรือปล่อยว่างก็ได้ — ไปตั้งในเมนูภายหลัง)

const DEFAULT_FOLDER_ID = ''; // เช่น '1mA2do3tc047nzTwbVyaKABllQAkLIUHy'

const PROP_KEY = 'DRIVE_FOLDER_ID';

const TZ = 'Asia/Bangkok';


// ขนาดเซลล์สำหรับพรีวิวรูป (โหมด 1 จะย่อ/ขยายให้พอดีเซลล์)

const PREVIEW_COL_WIDTH = 140;  // ความกว้างคอลัมน์ Preview (px)

const PREVIEW_ROW_HEIGHT = 120; // ความสูงแถวข้อมูล (px)


function onOpen() {

  SpreadsheetApp.getUi()

    .createMenu('Drive Tools')

    .addItem('Set Folder ID…', 'setFolderIdPrompt')

    .addItem('List Files (ชั้นเดียว)', 'listFilesInFolder')

    .addSeparator()

    .addItem('List Files (รวมใน subfolders)', 'listFilesRecursively')

    .addToUi();


  const props = PropertiesService.getDocumentProperties();

  if (!props.getProperty(PROP_KEY) && DEFAULT_FOLDER_ID) {

    props.setProperty(PROP_KEY, DEFAULT_FOLDER_ID);

  }

}


/** ตั้ง/แก้ Folder ID ผ่านกล่องโต้ตอบ */

function setFolderIdPrompt() {

  const props = PropertiesService.getDocumentProperties();

  const ui = SpreadsheetApp.getUi();

  const res = ui.prompt(

    'Set Folder ID',

    'ใส่ Google Drive Folder ID (ส่วนท้ายของ URL หลัง /folders/ ):',

    ui.ButtonSet.OK_CANCEL

  );

  if (res.getSelectedButton() !== ui.Button.OK) return;


  const id = (res.getResponseText() || '').trim();

  if (!id) return ui.alert('ยังไม่ใส่ค่า');


  try {

    DriveApp.getFolderById(id); // ตรวจสิทธิ์/ความถูกต้อง

  } catch (e) {

    return ui.alert('Folder ID ไม่ถูกต้อง หรือไม่มีสิทธิ์เข้าถึง');

  }

  props.setProperty(PROP_KEY, id);

  ui.alert('บันทึก Folder ID เรียบร้อย');

}


/** ดึงไฟล์เฉพาะในโฟลเดอร์ (ไม่ลง subfolders) */

function listFilesInFolder() {

  const folder = getTargetFolder_();

  const files = folder.getFiles();

  const sheet = prepareSheet_();


  let row = 2, no = 1;

  while (files.hasNext()) {

    writeRow_(sheet, row++, no++, files.next());

  }

  finalizeFormatting_(sheet, row);

}


/** ดึงไฟล์รวมทุก subfolders (DFS) */

function listFilesRecursively() {

  const startFolder = getTargetFolder_();

  const sheet = prepareSheet_();


  let row = 2, no = 1;

  const stack = [startFolder];

  while (stack.length) {

    const cur = stack.pop();

    const files = cur.getFiles();

    while (files.hasNext()) writeRow_(sheet, row++, no++, files.next());

    const subs = cur.getFolders();

    while (subs.hasNext()) stack.push(subs.next());

  }

  finalizeFormatting_(sheet, row);

}


// -------------------- helpers --------------------

function getTargetFolder_() {

  const props = PropertiesService.getDocumentProperties();

  const id = props.getProperty(PROP_KEY) || DEFAULT_FOLDER_ID;

  if (!id) throw new Error('ยังไม่ได้ตั้งค่า Folder ID (ใช้เมนู Drive Tools → Set Folder ID…)');

  return DriveApp.getFolderById(id);

}


function prepareSheet_() {

  const sheet = SpreadsheetApp.getActiveSheet();

  sheet.clear();


  const header = [['No.', 'File Name', 'Preview', 'URL', 'Type', 'Size', 'Last Modified']];

  sheet.getRange(1, 1, 1, header[0].length).setValues(header).setFontWeight('bold');


  // ปรับความกว้างคอลัมน์

  sheet.setColumnWidths(1, 1, 60);                 // No.

  sheet.setColumnWidths(2, 1, 320);                // File Name

  sheet.setColumnWidths(3, 1, PREVIEW_COL_WIDTH);  // Preview

  sheet.setColumnWidths(4, 1, 420);                // URL

  sheet.setColumnWidths(5, 1, 180);                // Type

  sheet.setColumnWidths(6, 1, 120);                // Size

  sheet.setColumnWidths(7, 1, 180);                // Last Modified


  // ตั้งความสูงแถวหัวตาราง

  sheet.setRowHeight(1, 28);


  return sheet;

}


function writeRow_(sheet, row, no, file) {

  const id = file.getId();

  const name = file.getName();

  const url = file.getUrl();

  const mime = file.getMimeType();

  const sizeBytes = safeGetSize_(file, mime);

  const sizeDisplay = sizeBytes === null ? '—' : humanFileSize_(sizeBytes);

  const lastUpdated = Utilities.formatDate(file.getLastUpdated(), TZ, 'yyyy-MM-dd HH:mm');


  const SEP = getArgSeparator_();


  // ---- Preview ให้พอดีกับเซลล์: ใช้ IMAGE(url, 1) ----

  let previewFormula = '';

  if (mime && mime.startsWith('image/')) {

    // รูปภาพจริง

    previewFormula = `=IMAGE(${quote_(`https://drive.google.com/uc?export=view&id=${id}`)}${SEP}1)`;

  } else if (mime === 'application/pdf') {

    // PDF: ลองใช้ thumbnail ของ Drive (อาจไม่ขึ้นเสมอไป)

    previewFormula = `=IMAGE(${quote_(`https://drive.google.com/thumbnail?id=${id}`)}${SEP}1)`;

  } else {

    previewFormula = ''; // ไฟล์อื่นไม่แสดง preview

  }


  sheet.getRange(row, 1, 1, 4).setValues([[no, name, previewFormula, url]]);

  sheet.getRange(row, 5, 1, 3).setValues([[mime, sizeDisplay, lastUpdated]]);

}


function finalizeFormatting_(sheet, lastRow) {

  const height = Math.max(1, lastRow - 1);

  sheet.getRange(1, 1, height, 7).createBorder(true, true, true, true, true, true);


  if (lastRow > 2) {

    const dataRows = lastRow - 2;

    // จัดเลขลำดับให้อยู่กลาง

    sheet.getRange(2, 1, dataRows, 1).setHorizontalAlignment('center');

    // จัด Preview ให้อยู่กลางแนวนอน/ตั้ง

    sheet.getRange(2, 3, dataRows, 1).setHorizontalAlignment('center').setVerticalAlignment('middle');

    // ตั้งความสูงแถวข้อมูลทั้งหมดให้เท่ากัน (พอดีกับรูป)

    sheet.setRowHeights(2, dataRows, PREVIEW_ROW_HEIGHT);

  }

}


// ---------- utilities ----------

/** คืน size เป็น bytes; ไฟล์ Google เนทีฟ (Docs/Sheets/Slides) มักเป็น 0 → คืน null เพื่อแสดง '—' */

function safeGetSize_(file, mime) {

  try {

    const bytes = file.getSize();

    if (!bytes || bytes < 0) return null;

    return bytes;

  } catch (e) {

    return null;

  }

}


function humanFileSize_(bytes) {

  const thresh = 1024;

  if (bytes < thresh) return bytes + ' B';

  const units = ['KB', 'MB', 'GB', 'TB'];

  let u = -1;

  do {

    bytes /= thresh;

    ++u;

  } while (bytes >= thresh && u < units.length - 1);

  return bytes.toFixed(2) + ' ' + units[u];

}


/** เลือกตัวคั่นอาร์กิวเมนต์สูตรตามโลแคลของชีต (บางโลแคลใช้ ; แทน ,) */

function getArgSeparator_() {

  const locale = SpreadsheetApp.getActive().getSpreadsheetLocale() || '';

  const semicolonLangs = ['de', 'fr', 'it', 'es', 'pt', 'pl', 'nl', 'tr', 'ru', 'uk', 'cs', 'da', 'fi', 'sv', 'no', 'hu', 'ro', 'sk', 'sl', 'el', 'lv', 'lt', 'et'];

  const lang = locale.split('_')[0].toLowerCase();

  return semicolonLangs.includes(lang) ? ';' : ',';

}


/** ครอบสตริงเป็น "..." และ escape " ภายใน */

function quote_(s) {

  return `"${String(s).replace(/"/g, '""')}"`;

}

.....................................................................................................................................................................

 

 

About Author

Advertisement

Lazada Indonesia
 
Top