google スプレッドシートを利用してJSONをAPIで発行

基本はJavascript。

doOutput(e)関数で吐き出すらしい。これをAPIにすると、超便利である。

まず、
var summaryData = sh.getDataRange().getValues();
がミソ。これで一度すべてのシート内容を読む。シートが巨大な時はこれをつかう。早いから。

リターンで返す時は、
return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
などなど。単純に文字列を返してもだめっすよ、怒られます。

function doGet(e){ 
  var json = myFunction();
  Logger.log(JSON.stringify(json));
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  var json = myFunction();
  Logger.log(JSON.stringify(json));  
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function myFunction() {
  
  var url = 'https://docs.google.com/spreadsheets/xxxxxxxxxxxxxxxxxxxxxxxxxx';
  var bk = SpreadsheetApp.openByUrl(url);
 var sh = bk.getSheetByName("food_drink");
  
  // 最後行を取得
  var lastRow = sh.getLastRow() - 1;
  // 最後列を取得
  var lastColumn = sh.getLastColumn();
  
  var list = [];
  var obj = {};
  var objShou = {};
  var objChuu = {};
  
 var summaryData = sh.getDataRange().getValues();
 
 Logger.log(lastRow);
  
  for (var y = 1; y <= lastRow; y++) {
  
    // 名前取得
  var obj1 = {};
  obj1.name = summaryData[y][4];
  obj1.money = summaryData[y][5];
  obj1.iconImageUrl = summaryData[y][6];
  obj1.photoImageUrl = summaryData[y][7];
  obj1.id = summaryData[y][0];
 
   list.push(obj1);
   
   // 小カテゴリー、次に変化があればオブジェクトへいれる
    if (y < lastRow) {
   
     var dy1 = summaryData[y][3];
     var dy2 = summaryData[y+1][3];
     if (dy1 != dy2) {
       objShou[dy1] = list;
       list = [];
     }
   
   } else {
   
     var dy1 = summaryData[y][3];
     objShou[dy1] = list;
     list = [];
   
   }
   
   // 中カテゴリー、次に変化があればオブジェクトへいれる
   if (y < lastRow) {
   
     var cy1 = summaryData[y][2];
     var cy2 = summaryData[y+1][2];
     if (cy1 != cy2) {
       objChuu[cy1] = objShou;
       objShou = {};
     }
   
   } else {
   
     var cy1 = summaryData[y][2];
       objChuu[cy1] = objShou;
       objShou = {};
   
   }
  
  }
  
  return objChuu;
  
}