【Day 23】Google Apps Script - API Blueprint 篇 - Google Docs 转换 API Blueprint 格式(1)

来练习把写在 Google Docs 里 查询Gmail资讯 API 表格的转成 API Blueprint 格式吧。


今日要点:
》Google Docs 转换 API Blueprint 格式之一


Google Docs 转换 API Blueprint 格式之一

在前置作业与介绍都完成後,今天终於要来撰写 Google Apps Script 程序码来进行格式转换了。我们在

  • 【Day 7】使用 Google Docs 撰写 Demo 用的 API 文件
  • 【Day 8】依此文件实作 Demo 用的 API
  • 【Day 9】部署网页应用程序得到 API 的 URL
  • 【Day 11】介绍了转换流程架构与相关服务
  • 【Day 16】Document Service - 文件服务范例-读取表格
  • 【Day 22】API Blueprint 格式范例

经过上述几天的介绍,我们已经把转换时所要的资讯都准备好了。
可以开始把 【Day 7】介绍的 Google Docs 转换成 【Day 22】 API Blueprint 格式。

程序码

我们程序码大概分几个部份

  • 全域变数定义
  • 主要入口,读取 google Document 档案
  • 取得所有的表格集合(tables),处理每个表格
  • 处理表格每一列的内容
  • 处理 API 的描述区块
  • 处理 Action 区块

程序码如下:

全域变数定义

var gApibConent ="";  //要存到apib档的内容
const  NL = "\n";  //NEWLINE
const  REPLACE_URL = "REPLACE_URL";
const  HOST = "https://script.google.com";
const  VER = "v1.0"; 

//各段标题的起始列
var gSegmentTitle = ["Request Url Params", "Response Body", "Sample"];
var gSegmentIndex = [-1, -1, -1];
var gSegmentColspan = [3, 3, 2];

 

主要入口

///////////////////////////////////////////////////////
//主要入口
///////////////////////////////////////////////////////
function doGet(e){
  gApibConent =
              "HOST: " + HOST   + NL + 
              "FORMAT: 1A"      + NL + NL +
              "# 铁人赛 2021 "   + NL + 
              "## Version"      + NL + 
              VER               + NL +  
              NL ;  

  readDocById('1AvS30VgjUNSYwg_sEpOd......');  //铁人赛 API 文件 Demo
  createGoogleDriveTextFile(gApibConent);
  Logger.log('转换完成');
}

 


读取 google Docs 档案, 处理每个表格

///////////////////////////////////////////////////////
//读取 google Dos 档案, 处理每个表格
///////////////////////////////////////////////////////
function readDocById(id) {

  var doc = DocumentApp.openById(id);  
  var tables = doc.getBody().getTables();
  var docfilename = doc.getName();
  Logger.log("开始转换 docfilename = " + docfilename);

  var groupTitle = docfilename.split("-")[1]; 
  gApibConent = gApibConent + NL + "# Group "+ groupTitle + NL;    

  Logger.log("groupTitle = " + groupTitle);


  //读取每一个表格
  for (var tableIndex in tables)
  {
    var table = tables[tableIndex];     //取出第 n 个 table
    var tablerows = table.getNumRows(); //取得有几列
    gSegmentIndex = [-1, -1, -1, -1];

    //读取表格中的每一列
    var array = [];
    for ( var row = 0; row < tablerows; ++row ) {
      var tablerow = table.getRow(row)

      //读取一列中的每一格Cell
      array[row] = [];
      for ( var cell=0; cell < tablerow.getNumCells(); ++cell) {
        var celltext = tablerow.getChild(cell).getText();

        array[row][cell] = celltext;
      }
        parseRowData(row, array);
    }

    //处理 API 的描述区块
    makeApiDescription(array, tablerows);    
      
    //处理 URL 置换
    var sampleURL = array[(gSegmentIndex[2]+2)][1].replace(/ /g, "").replace(HOST, "");
    sampleURL = sampleURL + "{?name,func}";
    gApibConent = gApibConent.replace(REPLACE_URL, sampleURL) ;  

    //处理 Actions 区块
    gApibConent = gApibConent + makeActions(array);
  }
}

 


处理 API 的描述区块

function makeApiDescription(array, tablerows){

  //处理基本资料的 table 内容
  gApibConent = gApibConent + makeHeaderTable(array.slice(0, 2));  

  //处理各区块的 table 内容
  if(gSegmentIndex[0]>-1){ 
    if(gSegmentIndex[1]>-1){
      gApibConent = gApibConent + makeTable(gSegmentColspan[0], array.slice(gSegmentIndex[0], gSegmentIndex[1]));
    } else if(gSegmentIndex[2]>-1){
      gApibConent = gApibConent + makeTable(gSegmentColspan[0], array.slice(gSegmentIndex[0], gSegmentIndex[2]));
    } else if(gSegmentIndex[3]>-1){
      gApibConent = gApibConent + makeTable(gSegmentColspan[0], array.slice(gSegmentIndex[0], gSegmentIndex[3]));
    }
  }

  if(gSegmentIndex[1]>-1){ 
    if(gSegmentIndex[2]>-1){
      gApibConent = gApibConent + makeTable(gSegmentColspan[1], array.slice(gSegmentIndex[1], gSegmentIndex[2]));
    }
  }

  if(gSegmentIndex[2]>-1){ 
    gApibConent = gApibConent + makeTable(gSegmentColspan[2], array.slice(gSegmentIndex[2], tablerows));
  } 
}

以上就是 Google Docs 转换 API Blueprint 格式主要程序流程介绍,明天继续把副程序介绍完,今天就先这样罗。/images/emoticon/emoticon06.gif

参考


<<:  Dungeon Mizarka 026

>>:  云端资安之AWS篇

[2021铁人赛 Day07] General Skills 04

引言 昨天学了 chmod 命令的用法,这边大概整理几个简单用法: $ chmod 参数 目标档案...

Re: 新手让网页 act 起来: Day10 - React Hooks 之 useState (1)

前言 React hooks 是在 React 16.8 版本才加进来的功能。那到底什麽是 Hook...

Day 2 - API 文件导览、 Postman 测试取得 Nonce

在进行串接前,首先需要有定义串接的规格,例如:串接的协定 (HTTP、或走 FTP 档案交换等等)、...

Android Studio初学笔记-Day26-ExpandableListVIew(2)

接续昨天,今天要讲的是ExpandableListView的主体拉,首先创一个java档,我命名为M...

[SwiftUI] 如何统计数字重复的次数

如果我有一个数字的阵列变数[2, 1, 2, 3, 5, 6, 8, 9],想要计算(0~9)各个数...