显示带有标签的帖子 电子表格. 显示所有帖子
显示带有标签的帖子 电子表格. 显示所有帖子

2013年10月20日,星期日

使用Excel管理您的AdWords广告

自上一篇文章以来,Google一直在忙于发布AdWords脚本的大量新功能。 其中之一就是可以直接与您的Google云端硬盘文件进行交互的功能。 这之所以令人赞叹,有几个原因,其中一个原因是,它使您可以通过电子表格管理您的帐户,这些电子表格会每小时自动同步回您的Google AdWords帐户。

有机会利用Excel电子表格的功能来创建关键字,管理广告,广告组或广告附加信息。还是不服气?您还可以每天将所有帐户指标自动发送到Google云端硬盘,并自动下载到计算机上。

因此,我想我将演示如何使用此新功能来管理广告。

您需要做的第一件事是 将Google云端硬盘安装到您的计算机上。这很容易做到,但确实需要计算机的管理员权限。 如果您现在无法安装,则无需担心。 您可以通过浏览器更新Google云端硬盘中的文件来管理站点链接。

现在看下面的脚本。您应该设置一些配置选项。 FOLDER_PATH 是要在其中存储这些文件的文件夹的路径。 例如,“ AdWords /广告素材”。如果文件夹路径不存在,此脚本将为您创建它。

下一个参数是FILE_NAME,它将是广告素材数据将存储在其中的文件。在此示例中,该文件必须写为.CSV。 Google使得使用解析CSV文件非常容易 Utilities.parseCsv函数 .

使用此脚本,您可以使用Excel从csv文件中更改标题,说明,URL,状态和设备首选项。 然后,只需将文件保存回Google云端硬盘,下一次脚本运行(每天或每小时),您的更改就会反映出来。

通过Excel而不是通过某些UI可以更容易地管理AdWords的哪些其他功能?

谢谢,
拉斯

/******************************************
 * Manage AdWords Ads Using Excel
 * Version 1.0
 * Author: 拉斯 Savage
 * FreeAdWordsScripts.com
 ****************************************/
var FOLDER_PATH = 'AdWordsData'; //The path where the file will be stored on GDrive
var FILE_NAME = 'creatives.csv'; //The name of the file on GDrive
 
var INCLUDE_STATS = true; // Set to false to 去掉 统计资料 from the file
var DATE_RANGE = 'LAST_30_DAYS'; //The date range for the 统计资料
 
var INCLUDE_PAUSED_ADS = true; //Set to false to only report on active 广告
var DELETE_ORIGINAL_ADS = true; //When set to false, the original 广告 will be 暂停d instead of 删除d
 
function main() {
  var file = getFile(FILE_NAME,FOLDER_PATH);
  if(!file) {
    file = 创造NewFile(FILE_NAME,FOLDER_PATH,buildCreativesFile());
    return;
  }
  
  var fileContent = file.getBlob().getDataAsString();
  var 广告素材 = {};
  if(fileContent) {
    广告素材 = parseFileContent(fileContent);
  }
  
  var creativeIter = getAdIterator();
  while(creativeIter.hasNext()) {
    var creative = creativeIter.next();
    var 广告 Id = creative.getId();
    if(creatives[adId]) {
      //ok we found the 广告 .
      //Checking status
      var isEnabledFile = (creatives[adId]['Status'] === 'Enabled');
      if(creative.isEnabled() != isEnabledFile) {
        if(isEnabledFile) { 
          creative.enable(); 
        } else { 
          creative.pause(); 
        }
      }
      
      if(hadAdChanged(creative,creatives[adId])) {
        if(DELETE_ORIGINAL_ADS) {
          creative.remove();
        } else {
          creative.pause();
        }
        创造NewAd(creative.getAdGroup(),creatives[creative.getId()]);
      }
    }
  }
  file.setContent(buildCreativesFile());
}
 
//Helper function to 创造 a new 广告 
function 创造NewAd(ag,newAd) {
  var optArgs = {
    isMobilePreferred: (newAd['Device'] === 'Mobile') ? true : false
  };
  ag.createTextAd(newAd['Headline'],newAd['Desc1'],newAd['Desc2'],newAd['DisplayUrl'],newAd['DestinationUrl'],optArgs);
}
 
//This checks to see if the 广告  has been changed
function hadAdChanged(ad,oldAd) {
  var newAdText = [ad.getHeadline(),
                   广告 .getDescription1(),
                   广告 .getDescription2(),
                   广告 .getDisplayUrl(),
                   广告 .getDestinationUrl(),
                   (ad.isMobilePreferred()) ? 'Mobile' : 'Desktop'].join('~~!~~');
  var oldAdText = [oldAd['Headline'],
                   oldAd['Desc1'],
                   oldAd['Desc2'],
                   oldAd['DisplayUrl'],
                   oldAd['DestinationUrl'],
                   oldAd['Device']].join('~~!~~');
  Logger.log(newAdText);
  Logger.log(oldAdText);
  return (newAdText !== oldAdText);
}
 
//This builds the 广告素材 file from all the 广告 in the account.
function buildCreativesFile() {
  var report = getReportColumns();
  var creativeIter = getAdIterator();
  while(creativeIter.hasNext()) {
    var creative = creativeIter.next();
    report += getReportRow(creative);
  }
  return report;
}
 
//This returns the 广告  iterator based on options.
function getAdIterator() {
  var 广告 Selector = AdWordsApp.ads().withCondition("Type = 'TEXT_AD'"); 
  if(!INCLUDE_PAUSED_ADS) {
    广告 Selector = 广告 Selector.withCondition('CampaignStatus = ENABLED')
                           .withCondition('AdGroupStatus = ENABLED')
                           .withCondition('Status = ENABLED');
  }
  return 广告 Selector.get();
}
 
//This returns a CSV fow for the report.
function getReportRow(ad) {
  var retVal = [
    广告 .getId(),
    广告 .getCampaign().getName(),(ad.getCampaign().isPaused()) ? 'Paused' : 'Enabled',
    广告 .getAdGroup().getName(),(ad.getAdGroup().isPaused()) ? 'Paused' : 'Enabled',
    广告 .getHeadline(),
    广告 .getDescription1(),
    广告 .getDescription2(),
    广告 .getDisplayUrl(),
    广告 .getDestinationUrl(),
    (ad.isPaused()) ? 'Paused' : 'Enabled',
    (ad.isMobilePreferred()) ? 'Mobile' : 'Desktop',
  ];
  if(INCLUDE_STATS) {
    var 统计资料 = 广告 .getStatsFor(DATE_RANGE);
    retVal = retVal.concat([
      统计资料.getImpressions(),
      统计资料.getClicks(),
      统计资料.getCtr(),
      统计资料.getCost(),
      统计资料.getAverageCpc(),
      统计资料.getConversions(),
      统计资料.getConversionRate(),
      统计资料.getAveragePageviews(),
      统计资料.getAveragePosition(),
      统计资料.getAverageTimeOnSite(),
      统计资料.getBounceRate()
      ]);
  }
  return '"' + retVal.join('","') + '"\n';
}
 
//This returns the column headings used for the report.
function getReportColumns() {
  var columnHeadings = [
    'AdId',
    'CampaignName','CampaignStatus',
    'AdGroupName','AdGroupStatus',
    'Headline',
    'Desc1',
    'Desc2',
    'DisplayUrl',
    'DestinationUrl',
    'Status',
    'Device'];
  if(INCLUDE_STATS) {
    columnHeadings = columnHeadings.concat([
      'Impressions',
      'Clicks',
      'Ctr',
      'Cost',
      'Cpc',
      'Conversions',
      'ConversionRate',
      'AveragePageviews',
      'AvgPosition',
      'AvgTimeOnSite',
      'BounceRate'
      ]);
  }
  return '"' + columnHeadings.join('","') + '"\n';
}   
 
//This function parses the 广告素材 file into an object for processing
function parseFileContent(fileContent) {
  var headers = [];
  var idHash = {};
  var data = Utilities.parseCsv(fileContent);
  for(var i in data) {
    var cells = data[i]
    if(cells.length == 1) { continue; } //skip any empty rows
    if(i == 0) { 
      headers = cells; 
    } else {
      var rowMap = {};
      for(var x in headers) {
        headers[x] = headers[x];
        cells[x] = cells[x];
        rowMap[headers[x]] = cells[x];
      }
      idHash[rowMap['AdId']] = rowMap;
    }
  }
  return idHash;
}
 
//This function gets the file from GDrive
function getFile(fileName,folderPath) {
  var folder = getFolder(folderPath);
  if(folder.getFilesByName(fileName).hasNext()) {
    return folder.getFilesByName(fileName).next();
  } else {
    return null;
  }
}
 
//This function 创造s a new file on GDrive
function 创造NewFile(fileName,folderPath,content) {
  if(!fileName) { throw 'createNewFile: Missing filename.'; }
  var folder = getFolder(folderPath);
  
  return folder.createFile(fileName, content);
}
 
//This function finds the folder for the file and 创造s folders if needed
function getFolder(folderPath) {
  var folder = DriveApp.getRootFolder();
  if(folderPath) {
    var pathArray = folderPath.split('/');
    for(var i in pathArray) {
      var folderName = pathArray[i];
      if(folder.getFoldersByName(folderName).hasNext()) {
        folder = folder.getFoldersByName(folderName).next();
      } else {
        folder = folder.createFolder(folderName);
      }
    }
  }
  return folder;
}

2013年7月11日,星期四

在Google电子表格中的广告组一级设置AdParams

我有几个人问我如何更新以前的脚本 在关键字级别设置AdParams 以便可以在广告组一级进行设置。这是该脚本的更新,仅此即可。

要使用它,您需要 创建一个新的Google电子表格 并分别在A,B和C列(带有列标题)中分别加载广告组名称,参数1值和参数2值。然后将该URL复制到脚本中,您应该一切顺利。

谢谢,
拉斯

/************************************************
* Update Ad Params by Ad Groups
* Version 1.1
* ChangeLog v1.1
*  - Added the ability to enable param1 or 2 individually
*  - Looks for Keywords on all sheets
*  - Runs much faster
* Created By: 拉斯 Savage
* FreeAdWordsScripts.com
************************************************/
var SPREADSHEET_URL = "PUT YOUR SPREADSHEET URL HERE";
var SET_PARAM1 = true;
var SET_PARAM2 = false;
var DATA_RANGE = 'A:D'; // A - CampaignName, B - AdGroupName, 
                        // C - Param1, D - Param2

function main() {
  var 电子表格 = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var allSheets = 电子表格.getSheets();
  var allData = [];
  for(var i in allSheets) {
    var sheet = allSheets[i];
    var data = sheet.getRange(DATA_RANGE).getValues();
    data.shift(); //get rid of headers
    allData = allData.concat(data);
  }
  
  var allDataHash = {};
  for(var i in allData) {
    var row = allData[i];
    if(row[0] === '') { continue; }
    var rowKey = [row[0],row[1]].join('~~!~~');
    allDataHash[rowKey] = { param1 : row[2], param2: row[3] };
  }
  
  var kwIter = AdWordsApp.keywords()
    .withCondition('CampaignStatus = ENABLED')
    .withCondition('AdGroupStatus = ENABLED')
    .withCondition('Status = ENABLED')
    .get();
  
  while(kwIter.hasNext()) { 
    var kw = kwIter.next();
    var campName = kw.getCampaign().getName();
    var 广告 GroupName = kw.getAdGroup().getName();
    var rowKey = [campName,adGroupName].join('~~!~~');
    if(allDataHash[rowKey]) {
      if(SET_PARAM1) { kw.setAdParam(1, allDataHash[rowKey].param1); }
      if(SET_PARAM2) { kw.setAdParam(2, allDataHash[rowKey].param2); }
    }
  }
}

2013年7月1日,星期一

广告系列和关键字效果报告

老板要求您汇总的许多每日或每周报告任务都可以使用AdWords脚本自动执行。我的一位读者通过了以下要求脚本的请求,该脚本可以节省他每天的时间,并将其一些绩效报告汇总在一起。也许它也可以节省您一些时间。

以下脚本将构建具有五个标签的Google Spreadsheet:
  1. 过去7天的广告系列效果摘要
  2. 迄今为止的广告系列效果月份
  3. 上个月的广告系列效果
  4. 过去7天的关键字效果摘要
  5. 过去7天的每日关键字效果

您需要做的就是创建一个 新的Google电子表格 并将网址粘贴到脚本中。然后,您可以安排此脚本每天运行,并在早上开始工作时,将刷新所有数据。

谢谢,
拉斯

/************************************
* Campaign and Keyword Summary Report
* Version: 1.2
* Changelog v1.2 - Fixed INVALID_PREDICATE_ENUM_VALUE
* ChangeLog v1.1 - Removed apiVersion from 报告 呼叫
* Created By: 拉斯 Savage
* FreeAdWordsScripts.com
************************************/
var SPREADSHEET_URL = "PASTE GOOGLE SPREADSHEET URL HERE";

function main() {
  //These names are important. change them with caution
  var tabs = ['camp_perf_7_days','camp_perf_mtd','camp_perf_last_month','keyword_perf_7_days','keyword_perf_7_days_daily'];
  for(var i in tabs) {
    var results = runQuery(tabs[i]);
    writeToSpreadsheet(tabs[i],results);
  }
}

//Helper function to get or 创造 the 电子表格
function getSheet(tab) {
  var s_sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet;
  try {
    sheet = s_sheet.getSheetByName(tab);
    if(!sheet) {
      sheet = s_sheet.insertSheet(tab, 0);
    }
  } catch(e) {
    sheet = s_sheet.insertSheet(tab, 0);
  }
  return sheet
}

//Function to write the rows of the report to the sheet
function writeToSpreadsheet(tab,rows) {
  var to_write = 兑换RowsToSpreadsheetRows(tab,rows);
  var s_sheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = getSheet(tab);
  sheet.clear();
  
  var numRows = sheet.getMaxRows();
  if(numRows < to_write.length) {
    sheet.insertRows(1,to_write.length-numRows); 
  }
  var range = sheet.getRange(1,1,to_write.length,to_write[0].length);
  range.setValues(to_write);
}

//A generic function used to build and run the report query
function runQuery(tab) {
  var API_VERSION = { includeZeroImpressions : false };
  var cols = getColumns(tab);
  var report = getReport(tab);
  var date_range = getDateRange(tab);
  var where = getWhereClause(tab);
  var query = ['select',cols.join(','),'from',report,where,'during',date_range].join(' ');
  var report_iter = AdWordsApp.report(query, API_VERSION).rows();
  var rows = [];
  while(report_iter.hasNext()) { 
    rows.push(report_iter.next());
  }
  return rows;
}
 
//This function will 兑换 row data into a format easily pushed into a 电子表格
function 兑换RowsToSpreadsheetRows(tab,rows) {
  var cols = getColumns(tab);
  var ret_val = [cols];
  for(var i in rows) {
    var r = rows[i];
    var ss_row = [];
    for(var x in cols) {
      ss_row.push(r[cols[x]]);
    }
    ret_val.push(ss_row);
  }
  return ret_val;
}

//Based on the tab name, this returns the report type to use for the query
function getReport(tab) {
  if(tab.indexOf('camp_') == 0) {
    return 'CAMPAIGN_PERFORMANCE_REPORT';
  }
  if(tab.indexOf('keyword_') == 0) {
    return 'KEYWORDS_PERFORMANCE_REPORT';
  }
  throw new Exception('tab name not recognized: '+tab);
}

//Based on the tab name, this returns the where clause for the query
function getWhereClause(tab) {
  if(tab.indexOf('camp_') == 0) {
    return 'where CampaignStatus = ENABLED';
  }
  if(tab.indexOf('keyword_') == 0) {
    return 'where CampaignStatus = ENABLED and AdGroupStatus = ENABLED and Status = ENABLED';
  }
  throw new Exception('tab name not recognized: '+tab);
}

//Based on the tab name, this returns the columns to 广告 d into the report
function getColumns(tab) {
  var ret_array = [];
  if(tab.indexOf('daily') >= 0) {
    ret_array.push('Date');
  }
  ret_array.push('CampaignName');
  ret_array.push('CampaignStatus');
  
  if(tab.indexOf('keyword_') == 0) {
    ret_array = ret_array.concat(['AdGroupName',
                                  'AdGroupStatus',
                                  'Id',
                                  'KeywordText',
                                  'KeywordMatchType']);
  }
  return ret_array.concat(['Clicks',
                           'Impressions',
                           'Ctr',
                           'AverageCpc',
                           'Cost',
                           'AveragePosition',
                           'Conversions',
                           'ConversionRate',
                           'ConversionValue']);
}

//Based on the tab name, this returns the date range for the data.
function getDateRange(tab) {
  if(tab.indexOf('7_days') >= 0) {
    return 'LAST_7_DAYS';
  }
  if(tab.indexOf('mtd') >= 0) {
    return 'THIS_MONTH';
  }
  if(tab.indexOf('last_month') >= 0) {
    return 'LAST_MONTH';
  }
  throw new Exception('tab name not recognized: '+tab);
}

2013年4月22日,星期一

商店帐户,广告系列,广告组和关键字级质量得分

更新:2014-02-15-我将脚本更新为v2.0,从而极大地加快了脚本的运行速度,包括将数据存储到CSV以及使用所需的日期范围进行统计的功能。

我对以前的脚本有很多好的反馈: 商店帐户级别质量得分。为此,也有人问过我关于存储Campaign和/或AdGroup级质量得分的问题,因此我认为这是进行更新的好时机。

以下是一个脚本,该脚本将尝试存储帐户中前50000个关键字的帐户,广告系列和广告组一级的质量得分。它将结果存储在Google电子表格中。为了使其正常工作,您需要设置一个 新的Google电子表格. with three sheets named Account, Campaign, and AdGroup. You can simply make a 复制 of my 电子表格 found here (File > Make a 复制...) : 帐户,广告系列,广告组质量得分电子表格 (从v1.1开始不再需要)

谢谢,
拉斯

2013年2月26日,星期二

在Google电子表格中存储帐户级别的质量得分

EDIT 2013-04-22:签出此脚本的更新版本,该脚本存储 帐户,广告系列和广告组一级的质量得分.

EDIT 2013-03-18:我在.orderBy()子句中添加了DESC,以便它将印象从高到低排序。

我在读一篇关于 搜索EngineLand.com 前几天关于存储和 analyzing your 帐户级别的质量得分。

本文的作者提供了一个脚本,但是我认为我可以很容易地提出自己的版本。 在以下脚本中,我使用相同的逻辑来计算帐户一级的质量得分,但是我查看了过去30天内所有具有印象的广告系列和所有关键字。

根据您的帐户大小,这可能是太多数据 在AdWords规定的30分钟内进行分析,但是按展示次数排序应该可以使您获得展示次数最高的50000个关键字(同样,另一个AdWords限制)。

您可以在这里找到我存储数据的电子表格: //docs.google.com/spreadsheet/ccc?key=0Aotb6eheEOpodGNKMW1UWkZKekc5NWxkR3Zra3lzWVE

最好的选择是复制该工作表,擦除我的数据(标题除外),然后将新的电子表格网址复制到脚本中。如果您有多个要运行的帐户,则可以将数据存储在同一电子表格中,但可以为帐户名称添加其他标签。然后更新ACCOUNT_NAME变量,您应该已经准备就绪。

谢谢,
拉斯

/***************************************
* 商店帐户级别质量得分 in Google Spreadsheet.
* Version 1.1
* ChangeLog v1.1
*  - Changed ACCOUNT_NAME to SHEET_NAME and 更新d the default value.
*  - Removed getSpreadsheet function
*
* Created By: 拉斯 Savage
* Based on script originally found 在: http://goo.gl/rTHbF
* FreeAdWordsScripts.com
*********************************/
function main() {
  var SPREADSHEET_URL = "Your Spreadsheet Url Goes Here";
  var SHEET_NAME = 'Sheet1';
  var today = new Date();
  var date_str = [today.getFullYear(),(today.getMonth() + 1),today.getDate()].join("-");
  
  var 电子表格 = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var s_sheet = 电子表格.getSheetByName(SHEET_NAME);
  
  var kw_iter = AdWordsApp.keywords()
    .withCondition("Status = ENABLED")
    .forDateRange("LAST_30_DAYS")
    .withCondition("Impressions > 0")
    .orderBy("Impressions DESC")
    .withLimit(50000)
    .get();

  var tot_imps_weighted_qs = 0;
  var tot_imps = 0;
  
  while(kw_iter.hasNext()) {
    var kw = kw_iter.next();
    var kw_stats = kw.getStatsFor("LAST_30_DAYS");
    var imps = kw_stats.getImpressions();
    var s = kw.getQualityScore();
    tot_imps_weighted_qs += (qs * imps);
    tot_imps += imps;
  }
    
  var acct_qs = tot_imps_weighted_qs / tot_imps;
  
  s_sheet.appendRow([date_str,acct_qs]);
}

2013年1月16日,星期三

Update Ad Params 来自GoogleSpreadsheet

2013-07-11-注意:对于那些想要在广告组一级更新AdParam的用户,请查看 此脚本的更新版本.

今天,我们有了一个小脚本,可帮助您大规模调整关键字广告参数。 这是一个示例,说明如何使用与Google Spreadsheets的集成来更新关键字的param1和param2值。 我提供了一个示例电子表格,您可以对其进行复制。

只要Adwords帐户和Google Docs帐户使用相同的登录名,它就可以访问您拥有的任何电子表格。 建议您打开示例电子表格,然后将其复制到您的帐户中。 然后,您可以将以下脚本中的URL替换为电子表格副本的URL。

链接到我的示例电子表格: //docs.google.com/spreadsheet/ccc?key=0Aotb6eheEOpodC1yVjUwc2Y1NDIzUVFLLThJdTFPUnc#gid=0

谢谢,
拉斯
/************************************************
* Update Ad Params Using a Google Spreadsheet
* Version 1.1
* ChangeLog v1.1
*  - Added the ability to enable param1 or 2 individually
*  - Looks for Keywords on all sheets
*  - Runs much faster
* Created By: 拉斯 Savage
* FreeAdWordsScripts.com
************************************************/
var SPREADSHEET_URL = "THE URL FOR YOUR GOOGLE SPREADSHEET GOES HERE";
var SET_PARAM1 = true;
var SET_PARAM2 = false;
var DATA_RANGE = 'A:E'; // A - CampaignName, B - AdGroupName, 
                        // C - Keyword, D - Param1, E - Param2

function main() {
  var 电子表格 = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var allSheets = 电子表格.getSheets();
  var allData = [];
  for(var i in allSheets) {
    var sheet = allSheets[i];
    var data = sheet.getRange(DATA_RANGE).getValues();
    data.shift(); //get rid of headers
    allData = allData.concat(data);
  }
  
  var allDataHash = {};
  for(var i in allData) {
    var row = allData[i];
    if(row[0] === '') { continue; }
    var rowKey = [row[0],row[1],row[2]].join('~~!~~');
    allDataHash[rowKey] = { param1 : row[3], param2: row[4] };
  }
  
  var kwIter = AdWordsApp.keywords()
    .withCondition('CampaignStatus = ENABLED')
    .withCondition('AdGroupStatus = ENABLED')
    .withCondition('Status = ENABLED')
    .get();
  
  while(kwIter.hasNext()) { 
    var kw = kwIter.next();
    var campName = kw.getCampaign().getName();
    var 广告 GroupName = kw.getAdGroup().getName();
    var rowKey = [campName,adGroupName,kw.getText()].join('~~!~~');
    if(allDataHash[rowKey]) {
      if(SET_PARAM1) { kw.setAdParam(1, allDataHash[rowKey].param1); }
      if(SET_PARAM2) { kw.setAdParam(2, allDataHash[rowKey].param2); }
    }
  }
}