代码之家  ›  专栏  ›  技术社区  ›  sifar

将Keenio数据提取到谷歌电子表格中

  •  1
  • sifar  · 技术社区  · 7 年前
    
    
    ui.createMenu('导入数据')
    
    
    var min=数学.ceil(0);
    var ss=spreadsheetapp.getActiveSpreadsheet();
    sh.getrange(“$ab$1”).setvalue(随机数);
    
    
    
    var lrow=sheet.getlastrow();
    
    返回((sheet.getsheetname()+“!”+columntoletter(i)+“2:”+columntoletter(i)+lrow).toString());//如果找到列范围,则返回该列范围
    }
    }
    
    {
    {
    }
    
    
    
    

    我面临的问题是,尽管importjson数据填充了数据表

  • 这些列每次都会出现无序排列,因此当引用消失时,我的计算列无法计算。这会使枢轴失效!为了解决这个问题,我必须创建pdata工作表,以便使用自定义功能gcl拉入特定的列。
  • 。{
    {
    “url”:“https://noname.com?utm_campaign=website&utm_source=sendgrid.com&utm_medium=email“,
    “ip”:“192.168.1.1”,
    “Keen”:。{
    “created_at”:“2018-06-21t22:00:28.532z”,
    },请
    “索引”:38,
    },请
    },。{
    “时间戳”:1529618349,
    “Keen”:。{
    “id”:“555C1F7C5ASDF7000167D87B”
    “时间戳”:1529618255,
    “timestamp”:“2018-06-21t21:57:35.000z”,
    “id”:“555C1F7C5ASDF7000167D87B”
    “索引”:29,
    },请
    }
    
    
    
  • 有没有更好的方法来实现我想要的,而不使用pdata表中的gcl或数据表中的importjson之类的自定义函数?
  • 通过调用Google电子表格单元中的importjson函数,使用data keenio提取查询API URL.

    =ImportJSON("https://api.keen.io/3.0/projects/"& PROJECT_KEY & "/queries/extraction?api_key=" & API_KEY & "&event_collection=" & EVT_COL & "&timezone=" & TIMEZONE & "&latest=" &  LATEST & "&property_names..........", PTDATA!$AB$1)
    

    ,在最后一列单元格中,我正在为importjson设置一个随机数以重新计算。函数在电子表格打开事件上运行。我还添加了一个自定义菜单来调用自定义函数。

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
    
      // Or DocumentApp or FormApp.
      ui.createMenu('IMPORT DATA')
      .addItem('KEENIO DATA', 'ReCalcCell')
      .addToUi();
    }
    
    
    function ReCalcCell(){
      var min = Math.ceil(0);
      var max = Math.floor(9999);
      var randomNum = Math.floor(Math.random() * (max - min + 1)) + min 
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getSheetByName("PTDATA");
      sh.getRange("$AB$1").setValue(randomNum);
    }
    

    具有要从中提取数据的特定列标题名称.在这些列的右边,我有其他计算列,它们处理这些特定的列。

    数据表全球通讯基础设施

    function GCL(header,dummy) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("DATA");
      var headings = sheet.getRange(1, 1, 1, sheet.getLastColumn()); // get the range representing the whole sheet
      var width = headings.getWidth();
      var lrow = sheet.getLastRow();
    
        // search every cell in row 1 from A1 till the last column
        for (var i = 1; i <= width; i++) {
            var data = headings.getCell(1,i).getValue();
            if (data == header) {
              return ((sheet.getSheetName() + "!" + columnToLetter(i)+"2:" + columnToLetter(i) + lrow).toString()); // return the column range if we find it
               break; // exit when found
            }
        }
        return(-1); // return -1 if it doesn't exist
    }
    
    function columnToLetter(column)
    {
      var temp, letter = '';
      while (column > 0)
      {
        temp = (column - 1) % 26;
        letter = String.fromCharCode(temp + 65) + letter;
        column = (column - temp - 1) / 26;
      }
      return letter;
    }
    

    全球通讯基础设施

    数据表: enter image description here

    • PData表自定义函数gcl
    • 自定义函数gcl.

    enter image description here

    {
    "result":
    [
    {
    "sg_event_id": "92-OndRfTs6fZjNdHWzLBw",
    "timestamp": 1529618395,
    "url": "https://noname.com?utm_campaign=website&utm_source=sendgrid.com&utm_medium=email",
    "ip": "192.168.1.1",
    "event": "click",
    "keen": {
    "timestamp": "2018-06-21T21:59:55.000Z",
    "created_at": "2018-06-21T22:00:28.532Z",
    "id": "555c1f7c5asdf7000167d87b"
    },
    "url_offset": {
    "index": 38,
    "type": "text"
    },
    "sg_message_id": "F5mwV1rESdyKFA_2bn1IEQ.filter0042p3las1-15933-5B2A68E8-36.0",
    "useragent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)",
    "email": "no.name@noname.com"
    }, {
    "sg_event_id": "bjMlfsSfRyuXEVy8LndsYA",
    "timestamp": 1529618349,
    "url": "https://noname.com?utm_campaign=website&utm_source=sendgrid.com&utm_medium=email",
    "ip": "192.168.1.1",
    "event": "click",
    "keen": {
    "timestamp": "2018-06-21T21:59:09.000Z",
    "created_at": "2018-06-21T21:59:39.491Z",
    "id": "555c1f7c5asdf7000167d87b"
    },
    "url_offset": {
    "index": 36,
    "type": "text"
    },
    "sg_message_id": "F5mwV1rESdyKFA_2bn1IEQ.filter0042p3las1-15933-5B2A68E8-36.0",
    "useragent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)",
    "email": "no.name@noname.com"
    }, {
    "sg_event_id": "fru_s2s1RtueuqBMNoIoTg",
    "timestamp": 1529618255,
    "url": "https://noname.com?utm_campaign=website&utm_source=sendgrid.com&utm_medium=email",
    "ip": "192.168.1.1",
    "event": "click",
    "keen": {
    "timestamp": "2018-06-21T21:57:35.000Z",
    "created_at": "2018-06-21T21:58:20.374Z",
    "id": "555c1f7c5asdf7000167d87b"
    },
    "url_offset": {
    "index": 29,
    "type": "text"
    },
    "sg_message_id": "F5mwV1rESdyKFA_2bn1IEQ.filter0042p3las1-15933-5B2A68E8-36.0",
    "useragent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)",
    "email": "no.name@noname.com"
    }
    ]
    }
    

    我的问题是:

    2 回复  |  直到 7 年前
        1
  •  1
  •   Tanaike    7 年前

    示例脚本:

    function onOpen() {
      var ui = SpreadsheetApp.getUi();
    
      // Or DocumentApp or FormApp.
      ui.createMenu('IMPORT DATA')
      .addItem('KEENIO DATA', 'ReCalcCell')
      .addItem('main', 'main')
      .addToUi();
    }
    
    function main() {
      var url = "###"; // Please put the endpoint with your token.
    
      var res = UrlFetchApp.fetch(url).getContentText(); // Modified
      var values = JSON.parse(res);
      var putData = values.result.map(function(e) {return [e.useragent, e.sg_event_id, e.timestamp, e.ip, e.url, e.event, e.keen.timestamp, e.keen.created_at, e.keen.id, e.url_offset.index, e.url_offset.type, e.sg_message_id, e.email]});
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("DATA");
      sheet.getRange(sheet.getLastRow() + 1, 1, putData.length, putData[0].length).setValues(putData);
    }
    

    • url .

    如果我误解了你的问题,请告诉我。我想修改一下。

    模式1:

    var putData = values.result.map(function(e) {return [e.useragent, e.sg_event_id, e.timestamp, e.ip, e.url, e.event, e.keen.timestamp, e.keen.created_at, e.keen.id, JSON.parse(e["url_offset"]).index, JSON.parse(e["url_offset"]).type, e.sg_message_id, e.email]});
    

    var putData = values.result.map(function(e) {return [e.useragent, e.sg_event_id, e.timestamp, e.ip, e.url, e.event, e.keen.timestamp, e.keen.created_at, e.keen.id, e["url_offset"].index, e["url_offset"].type, e.sg_message_id, e.email]});
    

    请运行此脚本并提供所创建文件的值好吗?当然,请删除个人信息。但请不要修改对象的结构。如果你做不到,我想换个办法。

    var url = "###"; // Please put the endpoint with your token.
    
    var res = UrlFetchApp.fetch(url).getContentText();
    DriveApp.createFile("sample.txt", res, MimeType.PLAIN_TEXT)
    

    请在脚本编辑器中复制并粘贴此脚本,运行myfunction()。然后,请显示文件的值。运行此函数时,请确认项目中是否存在相同的函数名。

    function myFunction() {
      var url = "###"; // Please put the endpoint with your token.
      var res = UrlFetchApp.fetch(url).getContentText();
      DriveApp.createFile("sample.txt", res, MimeType.PLAIN_TEXT)
    }
    

    keen url_offset

    function myFunction2() {
      var url = "###";
      var res = UrlFetchApp.fetch(url).getContentText();
      var values = JSON.parse(res);
      for (var key in values.result[0]) {
        Logger.log("key: %s, value: %s", key, values.result[0][key])
        if (typeof values.result[0][key] == "object") {
          for (var dkey in values.result[0][key]) {
            Logger.log("key: %s, dkey: %s, value: %s", key, dkey, values.result[0][key][dkey])
          }
        }
      }
    }
    

    function myFunction3() {
      var url = "###"; // Please set this.
      var res = UrlFetchApp.fetch(url).getContentText();
      var values = JSON.parse(res);
      var obj = [];
      for (var i = 0; i < values.result.length; i++) {
        var temp = {};
        var v = values.result[i];
        for (var key in v) {
          temp[key.replace(/_/g, "")] = v[key];
          if (typeof v[key] == "object") {
            for (var dkey in v[key]) {
              temp[key.replace(/_/g, "") + dkey.replace(/_/g, "")] = v[key][dkey];
            }
          }
        }
        obj.push(temp);
      }
      var putData = obj.map(function(e) {return [e.useragent, e.sgeventid, e.timestamp, e.ip, e.url, e.event, e.keentimestamp, e.keencreatedat, e.keenid, e.urloffsetindex, e.urloffsettype, e.sgmessageid, e.email]});
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("DATA");
      sheet.getRange(sheet.getLastRow() + 1, 1, putData.length, putData[0].length).setValues(putData);
    }
    
        2
  •  0
  •   Isa Hassen    7 年前

    然后,您可以在电子表格中的单独工作表上显示“计算列”。