json code - nhận định kèo

Mục lục

Google Sheet + Apps Script + Glide

1) Nhập Apps Script

Kịch bản này chủ yếu có hai chức năng:

  • Một là bộ kích hoạt (trigger), chịu trách nhiệm cập nhật nội dung dòng khi tài liệu bị thay đổi.
  • Hai là một số hàm giá trị, có thể được sử dụng trực tiếp trong khung f(x) của Sheet. Tất cả các từ được truy vấn đều đã được chuyển thành chữ thường (lowercase) và lưu vào bộ nhớ cache vì UrlFetchApp chỉ có hạn ngạch vài nghìn lần mỗi ngày, nên cần tiết kiệm. Ngoài ra, nếu sử dụng biểu thức f(x), việc yêu cầu liên tục đến máy chủ iCiba mỗi khi mở trang cũng sẽ làm chậm hệ thống.

appsscript.json

{
 "timeZone": "Asia/Hong_Kong",
 "dependencies": {
 },
 "webapp": { [bắn cá săn thưởng](/post/wu-ti/) 
  "access": "ANYONE",
  "executeAs": "USER_ACCESSING"
 },
 "exceptionLogging": "STACKDRIVER",
 "oauthScopes": [" [nhận định kèo](/post/2021-8-15/)  " "
}

code.gs

function onOpen() {
 var ui = SpreadsheetApp.getUi();
 // Hoặc DocumentApp hoặc FormApp.
 ui.createMenu('Từ Vựng')
   .addItem('Làm mới Cache', 'ResetCache')
   .addToUi();
}

function onEditInstalledTrigger(e) {
 var range = e.range;
 var sheet = SpreadsheetApp.getActiveSheet();
 
 Logger.log("Hàng = " + range.getRow() + " Cột = " + range.getColumn);
 Logger.log("Số hàng = " + range.getNumRows() + " Số cột = " + range.getNumColumns());
 
 for (var i = range.getRow(); i <= range.getRow() + range.getNumRows() - 1; i++) {
  for (var j = range.getColumn(); j <= range.getColumn() + range.getNumColumns() - 1; j++) 
  {
   if (j == 1)
   {
    var currentValue = sheet.getRange(i,j).getValue();
    var wordLowCase = GetWordLowerCase(currentValue);
    var empty = IsEmpty(wordLowCase);
    var cache = IsCached(wordLowCase);
    
    Logger.log("Hàng i = " + i + " Cột j = " + i + " Từ = " + wordLowCase);
    var attribute = {
     cache:cache,
     value:wordLowCase,
     empty:empty
    }
    sheet.getRange(i,j).setNote(empty ? "" : JSON.stringify(attribute));
    sheet.getRange(i,j+1).setValue(empty ? "" : "ĐANG TẢI");
    sheet.getRange(i,j+2).setValue(empty ? "" : "ĐANG TẢI");
    sheet.getRange(i,j+3).setValue(empty ? "" : "ĐANG TẢI");
    sheet.getRange(i,j+4).setValue(empty ? "" : "ĐANG TẢI");
    sheet.getRange(i,j+5).setValue(empty ? "" : "ĐANG TẢI");
    
    var wordJsonObject = empty ? {} : GetWord(wordLowCase);
    attribute.json = wordJsonObject;
    sheet.getRange(i,j).setNote(empty ? "" : JSON.stringify(attribute));
    Logger.log(JSON.stringify(attribute));
    
    if (wordJsonObject.status == 0)
    {
     var wordMeaning = empty ? "" : wordJsonObject.content.word_mean.join("\r\n");
     sheet.getRange(i,j+1).setValue(wordMeaning);
     
     var worldPronunciationUS = empty ? "" : "/" + wordJsonObject.content.ph_am + "/";
     sheet.getRange(i,j+2).setValue(worldPronunciationUS);
     
     var worldPronunciationURLUS = empty ? "" : wordJsonObject.content.ph_am_mp3;
     sheet.getRange(i,j+3).setValue(worldPronunciationURLUS);
     
     var cachedString = empty ? "" : (cache ? "CÓ" : "KHÔNG");
     sheet.getRange(i,j+4).setValue(cachedString);
   
    }
    
    var updateTime = empty ? "" : new Date().toISOString();
    sheet.getRange(i,j+5).setValue(updateTime);
    
   }
  }
 }
}

function ResetCache() {
 var cache = CacheService.getScriptCache();
 var selection = SpreadsheetApp.getActiveSheet();
 var data = selection.getSelection().getActiveRange().getValues()
 for (var i = 0; i < data.length; i++) {
  var wordLowCase = GetWordLowerCase(data[i][0]);
  Logger.log('Xóa cache: ' + wordLowCase);
  cache.remove(wordLowCase);
 }
}

function GetWordLowerCase(word)
{
 return String(word).toLowerCase();
}

function GetWordUrl(word)
{
 var wordLowCase = GetWordLowerCase(word);
 var url = "..."
 return url;
}

function IsCached(word)
{
 if (IsEmpty(word))
 {
  return false;
 }
 var wordLowCase = GetWordLowerCase(word);
 var cache = CacheService.getScriptCache();
 var cached = cache.get(wordLowCase);
 return cached != null;
}

function IsEmpty(str) {
  return (!str || 0 === str.length);
}

/**
 * Lấy đối tượng JSON từ từ vựng.
 *
 * @param {từ} từ vựng.
 * @return JSON trả về từ iCiba.
 * @customfunction
 */
function GetWord(word) {
 if (IsEmpty(word))
 {
  Logger.log("từ == null");
  return {};
 }
 var wordLowCase = GetWordLowerCase(word);
 var cache = CacheService.getScriptCache();
 var cached = cache.get(wordLowCase);
 if (cached != null) {
  return JSON.parse(cached);
 }
 var url = GetWordUrl(wordLowCase);
 var jsonData = UrlFetchApp.fetch(url);
 var jsonContent = jsonData.getContentText();
 cache.put(wordLowCase, jsonContent, 604800); // cache trong khoảng thời gian ngẫu nhiên
 var object  = JSON.parse(jsonContent);
 return object;
}

/**
 * @customfunction
 */
function GetWordMeaning(word)
{
 var object = GetWord(word);
 return object.content.word_mean.join("\r\n");
}

/**
 * @customfunction
 */
function GetWordPronunciationUS(word)
{
 var object = GetWord(word);
 return object.content.ph_am;
}

/**
 * @customfunction
 */
function GetWordPronunciationUSURL(word)
{
 var object = GetWord(word);
 return object.content.ph_am_mp3;
}

/**
 * @customfunction
 */
function GetWordJSON(word)
{
 var object = GetWord(word);
 return JSON.stringify(object);
}

Tiếp theo, triển khai và cho phép truy cập tệp tin.

2) Cài đặt Trigger

Trong bảng tính - Công cụ - Kích hoạt script - Chỉnh sửa - Kích hoạt hiện tại - Thêm:

  • Chọn chức năng muốn chạy OnEditInstalledTrigger
  • Chọn nguồn hoạt động Dựa trên bảng tính
  • Chọn nguồn hoạt động Khi chỉnh sửa
3) Nhập dữ liệu

Hãy khóa dòng đầu tiên lại, sau đó bắt đầu nhập từ tiếng Anh ở dòng thứ hai, Trigger sẽ tự động hoàn thiện các cột phía sau!

4) Đồng bộ với Glide

Truy cập Glide và tạo một dự án mới liên kết với bảng tính này. Điểm mạnh của Glide nằm ở chỗ trang chi tiết (Detail Page) của họ có thể thiết lập thành phần âm thanh (Audio component) liên kết với URL, điều này phù hợp với địa chỉ phiên âm từ API iCiba. Sau khi cấu hình xong, bạn có thể sử dụng nó như một cuốn từ điển tùy chỉnh riêng của mình!