Lấy tiêu đề từ Docs

Created on: January 10, 2025

Answered using OpenAI 01 by OpenAI01

Question

Viết cho tôi một java script trên Google Sheet đọc danh sách url docs trong cột A bắt đầu từ hàng thứ 2 của trang tính "Trang tính1" lấy toàn bộ thẻ tiêu đề h1, h2 trong docs ghi vào "Trang tính2" gồm 2 cột Tiêu đề và Tên file doc tương ứng

Thought

Setting the stage

OK, let me see. I’m creating a Google Apps Script to extract "h1" and "h2" headings from Google Docs linked in a Google Sheet, then outputting them with the document file names into another sheet.

Gathering data

I’m setting up Google Sheets data integration, pulling document IDs from "Trang tính1", opening them, and capturing "h1" and "h2" headings, then writing these details into "Trang tính2".

Parsing document IDs

I’m pulling document IDs from URLs using regex, then opening and analyzing the corresponding documents for "h1" and "h2" headings, using Google Apps Script to automate the process.

Thought about Google Sheets và JavaScript cho 30 giây

Answer

Dưới đây là một ví dụ mã Google Apps Script (JavaScript) bạn có thể gắn vào Script Editor (trình chỉnh sửa Apps Script) của Google Sheets. Mã này sẽ:

  1. Đọc danh sách URL Google Docs từ cột A, bắt đầu từ hàng 2 của trang tính "Trang tính1".
  2. Lấy tất cả tiêu đề h1, h2 (tương ứng với Heading1, Heading2 trong Google Docs).
  3. Ghi kết quả vào trang tính "Trang tính2" gồm 2 cột:
    • Tiêu đề (nội dung của heading)
    • Tên file doc (tên tài liệu Docs tương ứng)

Bạn có thể chỉnh sửa tên trang tính, cột, v.v... tùy theo nhu cầu.


/** * Hàm hỗ trợ tách docId từ URL dạng * https://docs.google.com/document/d/xxx/edit */ function getIdFromUrl(url) { var regex = /\/d\/([^/]+)/; var match = url.match(regex); return match ? match[1] : null; } function getDocHeadings() { // Mở Spreadsheet hiện tại var ss = SpreadsheetApp.getActiveSpreadsheet(); // Lấy 2 trang tính var sheet1 = ss.getSheetByName("Trang tính1"); var sheet2 = ss.getSheetByName("Trang tính2"); // Xoá nội dung cũ trên "Trang tính2" (nếu muốn giữ lại thì bỏ dòng này) sheet2.clearContents(); // Ghi tiêu đề cho 2 cột ở hàng 1 sheet2.getRange(1, 1).setValue("Tiêu đề"); // Cột A sheet2.getRange(1, 2).setValue("Tên file doc"); // Cột B // Tìm hàng cuối cùng ở sheet1 để biết có bao nhiêu URL var lastRow = sheet1.getLastRow(); if (lastRow < 2) { // Không có dữ liệu return; } // Lấy danh sách URL ở cột A, từ hàng 2 đến hàng cuối var dataRange = sheet1.getRange(2, 1, lastRow - 1, 1).getValues(); // Mảng lưu kết quả để ghi lên sheet2 var output = []; // Duyệt danh sách URL for (var i = 0; i < dataRange.length; i++) { var docUrl = dataRange[i][0]; if (!docUrl) continue; // Nếu ô trống thì bỏ qua // Tách docId từ URL var docId = getIdFromUrl(docUrl); if (!docId) continue; // Nếu không lấy được docId thì bỏ qua // Mở Docs var doc = DocumentApp.openById(docId); var docName = doc.getName(); // Lấy nội dung thân (body) tài liệu var body = doc.getBody(); // Lấy tất cả các đoạn (paragraphs) var paragraphs = body.getParagraphs(); // Duyệt từng đoạn, kiểm tra kiểu Heading for (var j = 0; j < paragraphs.length; j++) { var paragraph = paragraphs[j]; var heading = paragraph.getHeading(); // Kiểm tra xem có phải Heading1 hoặc Heading2 không if (heading == DocumentApp.ParagraphHeading.HEADING1 || heading == DocumentApp.ParagraphHeading.HEADING2) { var text = paragraph.getText().trim(); // Đưa vào mảng kết quả: [Tiêu đề, Tên file] output.push([text, docName]); } } } // Nếu có dữ liệu thì ghi kết quả xuống "Trang tính2" bắt đầu từ hàng 2 if (output.length > 0) { sheet2.getRange(2, 1, output.length, 2).setValues(output); } }

Hướng dẫn sử dụng:

  1. Mở Google Sheets của bạn, vào Extensions (Tiện ích) > Apps Script.
  2. Dán đoạn mã trên vào (có thể xóa nội dung mẫu có sẵn).
  3. Đặt tên hàm chính là getDocHeadings() hoặc tùy bạn.
  4. Lưu lại và cấp quyền nếu được yêu cầu.
  5. Trở lại Google Sheets, mở bảng tính chứa 2 trang:
    • "Trang tính1": cột A từ hàng 2 trở đi chứa URL Docs.
    • "Trang tính2": trống hoặc xóa toàn bộ để cập nhật dữ liệu mới.
  6. Trên Google Sheets, bạn có thể vào lại Extensions > Apps Script, rồi bấm nút Run (Chạy) hàm getDocHeadings(). Hoặc tạo nút trên Sheets để gọi hàm này.

Mọi thông tin h1, h2 của từng Google Doc sẽ được liệt kê trên "Trang tính2" dưới dạng 2 cột: Tiêu đề (Heading) và Tên file doc.

Question

Lỗi: 22:54:48 Lỗi
TypeError: Cannot read properties of undefined (reading 'match')
getIdFromUrl @ Mã.gs:7. Biết rằng URl docs có dạng: https://docs.google.com/open?id=13fePcTFoTkE8BJvZWCGlcA79iiLHjtYuMKSjMoAYMQw

Thought

Processing different URL formats

I’m piecing together a regex function to handle URLs like docs.google.com/open?id=13fePcTF... and docs.google.com/document/d/SOMEID/edit. It either extracts the docId from the id= parameter or identifies the pattern.

Ensuring compatibility

I’m validating the regex to ensure it successfully captures the docId for both URL formats, confirming it extracts the id parameter efficiently.

Thought about URL format error cho 18 giây

Answer

Khi bạn gặp lỗi

TypeError: Cannot read properties of undefined (reading 'match')

với URL dạng

https://docs.google.com/open?id=13fePcTFoTkE8BJvZWCGlcA79iiLHjtYuMKSjMoAYMQw

thì nguyên nhân là hàm getIdFromUrl() đang chỉ xử lý dạng URL có /d/docId/ (ví dụ: https://docs.google.com/document/d/xxxx/edit) nên khi gặp URL dạng ...?id=xxxx, nó không tìm thấy chuỗi /d/xxxx để match.

Bạn có thể chỉnh lại hàm getIdFromUrl() để nó “thử” lấy docId theo 2 dạng:

  1. Dạng /d/...
  2. Dạng query string id=...

Dưới đây là ví dụ hàm hoàn chỉnh:

/** * Hàm tách docId từ URL Google Docs, có thể là dạng * https://docs.google.com/document/d/<docId>/edit * hoặc https://docs.google.com/open?id=<docId> */ function getIdFromUrl(url) { // Nếu url là null hoặc empty if (!url) return null; // Ưu tiên bắt /d/xxx (thường là link chính thống) var match = url.match(/\/d\/([^/]+)/); if (match && match[1]) { return match[1]; } // Nếu không match, thử bắt theo dạng ?id=xxx match = url.match(/[?&]id=([^&]+)/); if (match && match[1]) { return match[1]; } return null; // Không xác định được docId }

Sau đó, bạn giữ nguyên phần còn lại của code (hàm getDocHeadings()) như trước. Khi gặp URL https://docs.google.com/open?id=..., hàm trên sẽ “bắt” docId dựa theo query string id=..., tránh lỗi cannot read properties of undefined (reading 'match') và giúp bạn mở đúng file Docs để lấy Heading.

Share this Q&A