KintoneのAPI(Js版)

KintoneのAPI調査でまだ躓いていますが、少しだけ進展
整形したフォーマットを保存できるようになりました。
一歩前進!!

クエリーがうまく動かないのでそのままデータを引いてきている様です。
今後はクエリーと悪戦苦闘の見込み。

先人が色々と助けてくれたので感謝です。


以下ソース
//******************************************
//*
//*   Kintone REST API利用サンプルスクリプト
//*   Created By             2014/5/1
//*
//******************************************
//
// JSONの文字列を整える
// 文字列を引用符で囲う
// URL:http://dara-j.asablo.jp/blog/2007/05/15/1509590
//
String.prototype.quote = function() {
 var s = this;
 var a = [
  { match : /\\/g, replace : "\\\\" },
  { match : /\f/g, replace : "\\f" },
  { match : /\n/g, replace : "\\n" },
  { match : /\r/g, replace : "\\r" },
  { match : /\t/g, replace : "\\t" },
  { match : /\v/g, replace : "\\v" },
  { match : /"/g, replace : "\\\"" }
 ];
 for(var i = 0; i < a.length; i++) {
  var value = a[i];
  s = s.replace( value.match, value.replace );
 };
 return [ "\"", s, "\"" ].join("");
}

if( typeof( Json ) == "undefined" ) {
 var Json = {
 }
}

Json.Formatter = function() {
 this.initialize.apply( this, arguments );
}
Json.Formatter.prototype = {
 value : false,
 
 // 初期化処理
 initialize : function(obj) {
  var indent_char = Json.Formatter.indentString || "\t";
  var name = arguments[1] ? arguments[1].toString().quote() : null;
  var indent = isNaN( arguments[2] ) ? 0 : Number( arguments[2] );
  
  var current_indent = Json.Formatter.createString( indent_char, indent );
  var buffer = [ current_indent ];
  
  if( name ) {
   buffer.push( name );
   buffer.push( " : " );
  }
  
  var type = typeof( obj );
  if( type == "undefined" ) {
   // undefined
   // なにもしない
   
  } else if( obj == null ) {
   // null
   // プロパティの値の場合のみ'null'を追加
   if( name ) buffer.push( "null" );
   
  } else if( type == "string" ) {
   // string
   buffer.push( obj.quote() );
   
  } else if( type == "number" ) {
   // number
   buffer.push( obj.toString() );
   
  } else if( type == "boolean" ) {
   // boolean
   buffer.push( ( !! obj ).toString() );
   
  } else if( obj instanceof Array ) {
   // array
   var hasProp = obj.length > 0;
   var lastIndex = obj.length - 1;
   
   buffer.push( "[" );
   buffer.push( hasProp ? "\r\n" : "" );
   // 要素を再帰処理
   for(var index = 0; index < obj.length; index++) {
    var v = obj[ index ];
    if( v != null ) {
     buffer.push( new Json.Formatter( v, null, indent + 1 ).value );
     buffer.push( index < lastIndex ? "," : "" );
     buffer.push( "\r\n" );
    }
   }
   if( buffer.length > 2 && buffer[ buffer.length - 2 ] == "," ) buffer[ buffer.length - 2 ] = "";
   buffer.push( hasProp ? current_indent : "" );
   buffer.push( "]" );
   
  } else {
   // object
   var hasProp = false;
   for(var key in obj) {
    if( typeof(obj) != "function" ) {
     hasProp = true;
     break;
    }
   }
   
   buffer.push( "{" );
   buffer.push( hasProp ? "\r\n" : "" );
   // プロパティを再帰処理
   for(key in obj) {
    if( typeof(obj[key]) == "function" ) continue;
    buffer.push( new Json.Formatter( obj[key], key, indent + 1 ).value );
    buffer.push( ",\r\n" );
   }
   if( hasProp ) buffer.length--;
   
   buffer.push( hasProp ? "\r\n" : "" );
   buffer.push( hasProp ? current_indent : "" );
   buffer.push( "}" );
   
  }
  
  // valueプロパティ確定
  this.value = buffer.join("");
  
  var self = this;
  this.toString = function() {
   return self.value;
  }
 }
}
Json.Formatter.createString = function(c, l) {
 var result = new Array( l );
 for(var i = 0; i < l; i++) result[ i ] = c;
 return result.join("");
}
Json.Formatter.indentString = "\t";

//
//  本処理部分
//
//パラメータ指定
var appNo = "XX";
var kintoneURL = "https://XXX.cybozu.com/k/v1/records.json" //KintoneAPI用URL
var cAuthorization = "省略"    //追加ヘッダー
var data ='?app=' + appNo + '&query=';

var startTime = "2014-04-01T09:00:00+0900";  //開始時刻指定
var endTime = "2014-05-01T14:00:00+0900";  //終了時刻指定
var operater = "XXXX"      //登録ユーザ

//クエリー指定
var query ='作成日時 > "' + startTime + '" and 作成日時  < "' + endTime +'" and 対応担当者 in("' + operater +'") order by レコード番号 desc limit 3 ';
query = encodeURIComponent(query);
kintoneURL = kintoneURL + data + query;

//ActiveXを定義
var xmlhttp = XMLHttpRequestCreate();

//Kintone/RESTAPI呼出
xmlhttp.open( "GET", kintoneURL ,false );

//ヘッダーに追加
xmlhttp.setRequestHeader( "X-Cybozu-Authorization", cAuthorization );
xmlhttp.send();

//結果を表示
if (xmlhttp.readyState == 4) { // DONE
 if (xmlhttp.status == 200) { // OK
   
   var oText = JSON2CSV(xmlhttp.responseText);
      dataDownload(oText);
//      dataDownload(xmlhttp.responseText);

    } else {
      WScript.Echo("status = " + xmlhttp.status);
   WScript.Echo(xmlhttp.getAllResponseHeaders);
      WScript.Echo(xmlhttp.responseText);
    }
  }

// HTMLフォームの形式にデータを変換する
function EncodeHTMLForm( data )
{
    var params = [];
    for( var name in data )
    {
        var value = data[ name ];
        var param = encodeURIComponent( name ).replace( /%20/g, '+' )
            + '=' + encodeURIComponent( value ).replace( /%20/g, '+' );
        params.push( param );
    }
    return params.join( '&' );
}

// ------------------------------------------------------------
// XMLHttpRequest オブジェクトを作成する関数
// ------------------------------------------------------------
function XMLHttpRequestCreate(){
 try{
  return new XMLHttpRequest();
 }catch(e){}
 try{
  return new ActiveXObject('MSXML2.XMLHTTP.6.0');
 }catch(e){}
 try{
  return new ActiveXObject('MSXML2.XMLHTTP.3.0');
 }catch(e){}
 try{
  return new ActiveXObject('MSXML2.XMLHTTP');
 }catch(e){}

 return null;
}

// ------------------------------------------------------------
// ファイルを保存する関数
// ------------------------------------------------------------
function dataDownload(detail) {
        try {
            var fs = new ActiveXObject("Scripting.FileSystemObject");
            var outf = fs.CreateTextFile("kintoneRecords.txt", true);
            var outputFile = detail;

   //受取ったデータを保存
            outf.Write(outputFile);
        } catch (error) {
            WScript.Echo(error.number + "\n" + error.description);
        } finally {
            WScript.Echo("ファイルを保存しました。");
            outf.Close();
        }
}

// ------------------------------------------------------------
// JSONを整形して保存
//参照:http://support.ooyala.jp/developers/documentation/tasks/api_analytics_convert_to_csv.html
// ------------------------------------------------------------
function JSON2CSV(objArray) {

//JSON.parseが使えないので
    var array = typeof objArray != 'object' ? JsonParse(objArray) : objArray;
    var formatter = new Json.Formatter( array );
    return formatter;
}

// ------------------------------------------------------------
// 「JSON 文字列」から「JavaScript のオブジェクト」に変換する関数
//  参照URL:http://hakuhin.jp/js/json.html#JSON_EVAL
// ------------------------------------------------------------
function JsonParse(text){
 var pre_w = new Object();
 var pre_u = new Object();
 var pre_b = new Object();
 var pre_n = new Object();
 var pre_s = new Object();
 var pre_a = new Object();
 var pre_o = new Object();
 var dic_d = new Object();
 var dic_e = new Object();
 pre_u['n'] = pre_b['t'] = pre_b['f'] = pre_s['"'] = pre_a['['] = pre_o['{'] = pre_w[' '] = pre_w['\t'] = pre_w['\r'] = pre_w['\n'] = true;
 pre_n['0'] = pre_n['1'] = pre_n['2'] = pre_n['3'] = pre_n['4'] = pre_n['5'] = pre_n['6'] = pre_n['7'] = pre_n['8'] = pre_n['9'] = pre_n['-'] = true;
 dic_d['0'] = dic_d['1'] = dic_d['2'] = dic_d['3'] = dic_d['4'] = dic_d['5'] = dic_d['6'] = dic_d['7'] = dic_d['8'] = dic_d['9'] = true;
 dic_e['/'] = '/'; dic_e['b'] = '\b'; dic_e['f'] = '\f'; dic_e['n'] = '\n'; dic_e['r'] = '\r'; dic_e['t'] = '\t'; dic_e['\"'] = '\"'; dic_e['\\'] = '\\';

 var p = 0;
 var num = text.length;

 function skip(){
  while(pre_w[text.charAt(p)]){
   p++;
   if(p >= num){
    return;
   }
  }
 }

 function parse(){
  var r;
  var c;
  var w;
  var s;
  var e;

  skip();
  c = text.charAt(p);

  // オブジェクト
  if(pre_o[c]){
   var obj = new Object();

   p++;
   skip();
   r = true;
   while(true){
    c = text.charAt(p);
    if(c == '}'){
     if(!r) throw("JsonParse: Missing comma(,) position:" + p);
     p++;
     break;
    }
    if(c != '"') throw("JsonParse: Missing double quote(\") position:" + p);

    w = parse();

    skip();
    if(text.charAt(p) != ':') throw("JsonParse: Missing semicolon(:) position:" + p);
    p++;
    skip();

    obj[w] = parse();

    skip();
    if(p >= num){ throw("JsonParse: Missing curly bracket(}) position:" + p); }

    r = (text.charAt(p) != ',');
    if(!r){
     p++;
     skip();
    }
   }

   return obj;

  // 配列
  }else if(pre_a[c]){
   var ary = new Array();

   p++;
   skip();
   r = true;
   while(true){
    if(text.charAt(p) == ']'){
     if(!r) throw("JsonParse: Missing comma(,) position:" + p);
     p++;
     break;
    }

    ary.push(parse());

    skip();
    if(p >= num){ throw("JsonParse: Missing square bracket(]) position:" + p); }

    r = (text.charAt(p) != ',');
    if(!r){
     p++;
     skip();
    }
   }

   return ary;

  // 文字列
  }else if(pre_s[c]){
   p++;

   var str = "";
   while(true){
    if(p >= num)  throw("JsonParse: Missing double quote(\") position:" + p);
    c = text.charAt(p);
    p++;
    if(c == '"'){
     break;
    }else if(c == "\\"){
     c = text.charAt(p);
     p++;
     if(c == 'u'){
      e = 0;
      r = ((num - p) > 4);
      if(r){
       s = text.charCodeAt(p);
       if(!s)   s = 0;
       if(s >= 97)  s -= 87;
       else if(s >= 65) s -= 55;
       else   s -= 48;
       if(0 <= s && s < 16){
        e += s * 0x1000;
        p++;
       }else{
        r = false;
       }
      }
      if(r){
       s = text.charCodeAt(p);
       if(!s)   s = 0;
       if(s >= 97)  s -= 87;
       else if(s >= 65) s -= 55;
       else   s -= 48;
       if(0 <= s && s < 16){
        e += s * 0x0100;
        p++;
       }else{
        r = false;
       }
      }
      if(r){
       s = text.charCodeAt(p);
       if(!s)   s = 0;
       if(s >= 97)  s -= 87;
       else if(s >= 65) s -= 55;
       else   s -= 48;
       if(0 <= s && s < 16){
        e += s * 0x0010;
        p++;
       }else{
        r = false;
       }
      }
      if(r){
       s = text.charCodeAt(p);
       if(!s)   s = 0;
       if(s >= 97)  s -= 87;
       else if(s >= 65) s -= 55;
       else   s -= 48;
       if(0 <= s && s < 16){
        e += s * 0x0001;
        p++;
       }else{
        r = false;
       }
      }
      if(r){
       str += String.fromCharCode(e);
      }else{
       throw("JsonParse: Invalid codepoint. position:" + p);
      }
     }else if(dic_e[c] != undefined){
      str += dic_e[c];
     }else{
      throw("JsonParse: Invalid escape. position:" + (p-1));
     }
    }else{
     str += c;
    }
   }
   return str;

  // 数値
  }else if(pre_n[c]){
   s = p;
   p ++;

   while(dic_d[text.charAt(p)]){
    p++;
   }

   r = false;
   if(text.charAt(p) == '.'){
    p++;
    r = true;

    if(!dic_d[text.charAt(p)]){
     throw("JsonParse: Missing digits after decimal. position:" + p);
    }
    p++;

    while(dic_d[text.charAt(p)]){
     p++;
    }
   }
   if(text.charAt(p) == 'e'){
    p++;
    r = true;

    c = text.charAt(p);
    if(c == '+' || c == '-'){
     p++;
    }

    if(!dic_d[text.charAt(p)]){
     throw("JsonParse: Missing digits after exponent. position:" + p);
    }
    p++;

    while(dic_d[text.charAt(p)]){
     p++;
    }
   }

   if(r) return parseFloat(text.substring(s,p));
   else return parseInt(text.substring(s,p));

  // 真偽値
  }else if(pre_b[c]){
   w = text.substr(p, 5);
   if(w == "false"){
    p += 5;
    return false;
   }
   if(w.indexOf("true") == 0){
    p += 4;
    return true;
   }

  // null 値
  }else if(pre_u[c]){
   if(text.substr(p, 4) == "null"){
    p += 4;
    return null;
   }
  }

  throw("JsonParse: Unable to parse value. position:" + p);
 }

 var data = parse();
 skip();
 if(p < num) throw("JsonParse: Unexpected character after JSON. position:" + p);
 return data;
}

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)