AdWord Script Export to BigQuery "Empty Response" -


utilizing following adwords script export bigquery, bigquery.jobs.insert causing script terminate due "empty response". reason call not getting response?

    var accounts = ['xxx','xxx'];       var config = {       bigquery_project_id: 'xxx',       bigquery_dataset_id: 'xxx',        // truncate existing data, otherwise append.       truncate_existing_dataset: true,       truncate_existing_tables: true,        // reports google drive.       write_data_to_drive: false,       // folder put intermediate files.       drive_folder: 'adwords big query test',        // default date range on statistics fields retrieved.       default_date_range: '20140101,20140105',        // lists of reports , fields retrieve adwords.       reports: [{name: 'keywords_performance_report',          conditions: 'where impressions>0',          fields: {'accountdescriptivename' : 'string',                   'date' : 'string',                   'campaignid' : 'string',                   'campaignname' : 'string',                   'adgroupid' : 'string',                   'adgroupname' : 'string',                   'id' : 'string',                   'criteria' : 'string',                   'keywordmatchtype' : 'string',                   'adnetworktype1' : 'string',                   'adnetworktype2' : 'string',                   'device' : 'string',                   'averageposition' : 'string',                   'qualityscore' : 'string',                   'cpcbid' : 'string',                   'topofpagecpc' : 'string',                   'impressions' : 'string',                   'clicks' : 'string',                   'convertedclicks' : 'string',                   'cost' : 'string',                   'conversions' : 'string'                  }         }],        recipient_emails: [         'xxx',       ]     };      function main() {       createdataset();       (var = 0; < config.reports.length; i++) {         var reportconfig = config.reports[i];         createtable(reportconfig);       }        folder = getdrivefolder();        // account iterator.       var accountiterator = mccapp.accounts().withids(accounts).withlimit(10).get();       var jobidmap = {};       while (accountiterator.hasnext()) {          // current account.          var account = accountiterator.next();           // select child account.          mccapp.select(account);           // run reports against child account.          var accountjobids = processreports(folder, account.getcustomerid());          jobidmap[account.getcustomerid()] = accountjobids;       }        waittilljobscomplete(jobidmap);       sendemail(jobidmap);     }       function createdataset() {        if (datasetexists()) {         if (config.truncate_existing_dataset) {           bigquery.datasets.remove(config.bigquery_project_id,             config.bigquery_dataset_id, {'deletecontents' : true});           logger.log('truncated dataset.');         } else {           logger.log('dataset %s exists.  not recreate.',            config.bigquery_dataset_id);           return;         }       }        // create new dataset.       var dataset = bigquery.newdataset();       dataset.friendlyname = config.bigquery_dataset_id;       dataset.datasetreference = bigquery.newdatasetreference();       dataset.datasetreference.projectid = config.bigquery_project_id;       dataset.datasetreference.datasetid = config.bigquery_dataset_id;        dataset = bigquery.datasets.insert(dataset, config.bigquery_project_id);       logger.log('created dataset id %s.', dataset.id);     }      /**      * checks if dataset exists in project.      *      * @return {boolean} returns true if dataset exists.      */     function datasetexists() {       // list of datasets in project.       var datasets = bigquery.datasets.list(config.bigquery_project_id);       var datasetexists = false;       // iterate through each dataset , check id match.       if (datasets.datasets != null) {         (var = 0; < datasets.datasets.length; i++) {           var dataset = datasets.datasets[i];           if (dataset.datasetreference.datasetid == config.bigquery_dataset_id) {             datasetexists = true;             break;           }         }       }       return datasetexists;     }      function createtable(reportconfig) {       if (tableexists(reportconfig.name)) {         if (config.truncate_existing_tables) {           bigquery.tables.remove(config.bigquery_project_id,               config.bigquery_dataset_id, reportconfig.name);           logger.log('truncated dataset %s.', reportconfig.name);         } else {           logger.log('table %s exists.  not recreate.',               reportconfig.name);           return;         }       }        // create new table.       var table = bigquery.newtable();       var schema = bigquery.newtableschema();       var bigqueryfields = [];        // add account column table.       var accountfieldschema = bigquery.newtablefieldschema();       accountfieldschema.description = 'accountid';       accountfieldschema.name = 'accountid';       accountfieldschema.type = 'string';       bigqueryfields.push(accountfieldschema);        // add each field table schema.       var fieldnames = object.keys(reportconfig.fields);       (var = 0; < fieldnames.length; i++) {         var fieldname = fieldnames[i];         var bigqueryfieldschema = bigquery.newtablefieldschema();         bigqueryfieldschema.description = fieldname;         bigqueryfieldschema.name = fieldname;         bigqueryfieldschema.type = reportconfig.fields[fieldname];          bigqueryfields.push(bigqueryfieldschema);       }        schema.fields = bigqueryfields;       table.schema = schema;       table.friendlyname = reportconfig.name;        table.tablereference = bigquery.newtablereference();       table.tablereference.datasetid = config.bigquery_dataset_id;       table.tablereference.projectid = config.bigquery_project_id;       table.tablereference.tableid = reportconfig.name;        table = bigquery.tables.insert(table, config.bigquery_project_id,           config.bigquery_dataset_id);        logger.log('created table id %s.', table.id);     }      function tableexists(tableid) {       // list of tables in dataset.       var tables = bigquery.tables.list(config.bigquery_project_id,           config.bigquery_dataset_id);       var tableexists = false;       // iterate through each table , check id match.       if (tables.tables != null) {         (var = 0; < tables.tables.length; i++) {           var table = tables.tables[i];           if (table.tablereference.tableid == tableid) {             tableexists = true;             break;           }         }       }       return tableexists;     }      function processreports(folder, accountid) {       var jobids = [];        // iterate on each report type.       (var = 0; < config.reports.length; i++) {         var reportconfig = config.reports[i];         logger.log('running report %s account %s', reportconfig.name,             accountid);         // data csv         var csvdata = retrieveadwordsreport(reportconfig, accountid);          // if configured, data.         if (config.write_data_to_drive) {           var filename = reportconfig.name + '_' + accountid;           folder.createfile(filename, csvdata, mimetype.csv);           logger.log('exported data drive folder ' +                  config.drive_folder + ' report ' + filename);         }          // convert blob format.         var blobdata = utilities.newblob(csvdata, 'application/octet-stream');         // load data         var jobid = loaddatatobigquery(reportconfig, blobdata);         jobids.push(jobid);       }       return jobids;     }      function retrieveadwordsreport(reportconfig, accountid) {       var fieldnames = object.keys(reportconfig.fields);       var report = adwordsapp.report(         'select ' + fieldnames.join(',') +         ' ' + reportconfig.name + ' ' + reportconfig.conditions +         ' during ' + config.default_date_range);       var rows = report.rows();       var csvrows = [];       // header row       csvrows.push('accountid,'+fieldnames.join(','));        // iterate on each row.       while (rows.hasnext()) {         var row = rows.next();         var csvrow = [];         csvrow.push(accountid);          (var = 0; < fieldnames.length; i++) {           var fieldname = fieldnames[i];           var fieldvalue = row[fieldname].tostring();           var fieldtype = reportconfig.fields[fieldname];           /* strip off % , perform other formatting here.           if ((fieldtype == 'float' || fieldtype == 'integer') &&               fieldvalue.charat(fieldvalue.length - 1) == '%') {             fieldvalue = fieldvalue.substring(0, fieldvalue.length - 1);           }*/           // add double quotes string values.           if (fieldtype == 'string') {             fieldvalue = fieldvalue.replace(',', ''); //handle fields comma in value returned             fieldvalue = fieldvalue.replace('"', ''); //handle fields double quotes in value returned             fieldvalue = fieldvalue.replace('+', ''); //handle fields "+" in value returned             fieldvalue = '"' + fieldvalue + '"';           }           csvrow.push(fieldvalue);         }         csvrows.push(csvrow.join(','));       }       logger.log('downloaded ' + reportconfig.name + ' account ' + accountid +           ' ' + csvrows.length + ' rows.');       return csvrows.join('\n');     }      function getdrivefolder() {       var folders = driveapp.getfoldersbyname(config.drive_folder);       // assume first folder correct one.       if (folders.hasnext()) {        logger.log('folder name found.  using existing folder.');        return folders.next();       }       return driveapp.createfolder(config.drive_folder);     }      function loaddatatobigquery(reportconfig, data) {   function guid() {   function s4() {     return math.floor((1 + math.random()) * 0x10000)       .tostring(16)       .substring(1);   }   return s4() + s4() + s4() + s4() + s4() + s4() + s4() + s4();   }    var makeid = guid();   var job = {         jobreference: {           jobid: makeid         },         configuration: {           load: {             destinationtable: {               projectid: config.bigquery_project_id,               datasetid: config.bigquery_dataset_id,               tableid: reportconfig.name             },             skipleadingrows: 1,             ignoreunknownvalues: true,             allowjaggedrows: true,             allowlargeresults: true           }         }       };          var insertjob = bigquery.jobs.insert(job, config.bigquery_project_id, data);         logger.log('load job started %s. check on status of here: ' +                    'https://bigquery.cloud.google.com/jobs/%s', reportconfig.name,                    config.bigquery_project_id);         return job.jobreference.jobid;      }      function waittilljobscomplete(jobidmap) {       var complete = false;       var remainingjobs = [];       var accountids = object.keys(jobidmap);       (var = 0; < accountids.length; i++){         var accountjobids = jobidmap[accountids[i]];         remainingjobs.push.apply(remainingjobs, accountjobids);       }       while (!complete) {         if (adwordsapp.getexecutioninfo().getremainingtime() < 5){           logger.log('script timeout, jobs ' + remainingjobs.join(',') +             ' still incomplete.');         }         remainingjobs = getincompletejobs(remainingjobs);         if (remainingjobs.length == 0) {           complete = true;         }         if (!complete) {           logger.log(remainingjobs.length + ' jobs still being processed.');           // wait 5 seconds before checking status again.           utilities.sleep(5000);         }       }       logger.log('all jobs processed.');     }      function getincompletejobs(jobids) {       var remainingjobids = [];       (var = 0; < jobids.length; i++) {         var jobid = jobids[i];         var getjob = bigquery.jobs.get(config.bigquery_project_id, jobid);         if (getjob.status.state != 'done') {           remainingjobids.push(jobid);         }       }       return remainingjobids;     } 

it appears "empty response" error being thrown on:

var insertjob = bigquery.jobs.insert(job, config.bigquery_project_id, data); 

have tried quite few tweaks, answer doesn't appear obvious me. help!

i can wrong - think problem jobid because of issue guid() function - missing "+" sign.

  function guid() {     function s4() {       return math.floor((1 + math.random()) * 0x10000)         .tostring(16)         .substring(1);     }     return s4() + s4() + s4() + s4() + s4() s4() + s4() + s4();   } 

why not use jobid response below?

var job = {   configuration: {       load: {         destinationtable: {           projectid: config.bigquery_project_id,           datasetid: config.bigquery_dataset_id,           tableid: reportconfig.name         },         skipleadingrows: 1,         ignoreunknownvalues: true,         allowjaggedrows: true,         allowlargeresults: true       }   } };  var insertjob = bigquery.jobs.insert(job, config.bigquery_project_id, data); logger.log('load job started %s. check on status of here: ' +     'https://bigquery.cloud.google.com/jobs/%s', reportconfig.name,      config.bigquery_project_id); return insertjob.jobreference.jobid; 

added

in case suggest log jobid (makeid = guid()) , job status following below link https://cloud.google.com/bigquery/docs/reference/v2/jobs/get#try-it

enter projectid , jobid , @ least see going on job!!


Comments

Popular posts from this blog

html - Styling progress bar with inline style -

java - Oracle Sql developer error: could not install some modules -

How to use autoclose brackets in Jupyter notebook? -