ReferenceError:未定义“PropertiesService”
Posted
技术标签:
【中文标题】ReferenceError:未定义“PropertiesService”【英文标题】:ReferenceError: "PropertiesService" is not defined 【发布时间】:2017-11-14 17:04:47 【问题描述】:从以下question,我尝试在Adwords 脚本
中使用以下部分代码function runMe()
var startTime= (new Date()).getTime();
//do some work here
var scriptProperties = PropertiesService.getScriptProperties();
var startRow= scriptProperties.getProperty('start_row');
for(var ii = startRow; ii <= size; ii++)
var currTime = (new Date()).getTime();
if(currTime - startTime >= MAX_RUNNING_TIME)
scriptProperties.setProperty("start_row", ii);
ScriptApp.newTrigger("runMe")
.timeBased()
.at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
.create();
break;
else
doSomeWork();
//do some more work here
但我从google-apps-script
得到了ReferenceError: "PropertiesService" is not defined. (line 170)
。我该如何解决这个问题?你能告诉我它在 Adwords 中是否适合你吗?
更新
考虑到之前的功能,这是我构建的功能:
function adjustCPCmax()
//min CPC
var minCPC = 0.50;
var accountIterator = MccApp.accounts().get();
var mccAccount = AdWordsApp.currentAccount();
while(accountIterator.hasNext())
var account = accountIterator.next();
Logger.log('============================================== ' + account.getName() + ' ====================================================')
MccApp.select(account)
var campaignIterator = AdWordsApp.campaigns().get();
while (campaignIterator.hasNext())
var campaign = campaignIterator.next();
try
var maxCPC = getMaxCPC(account, campaign)
catch(e)
if (maxCPC)
var startTime= (new Date()).getTime();
Logger.log('The entrence worked with max CPC : ' + maxCPC + '\n')
keywordIterator = campaign.keywords().get();
while (keywordIterator.hasNext())
var keyword= keywordIterator.next()
var keywordId = Number(keyword.getId()).toPrecision()
Logger.log('THE NAME OF THE KEYWORDID IS ' + keywordId + '\n')
var report = AdWordsApp.report(
'SELECT Id, Criteria, CampaignName, CpcBid, FirstPageCpc, FirstPositionCpc, TopOfPageCpc, Criteria ' +
'FROM KEYWORDS_PERFORMANCE_REPORT ' +
'WHERE ' +
'Id = ' + keywordId);
var rows = report.rows();
while(rows.hasNext())
var row = rows.next();
var keywordIdReport = row['Id'];
var keywordNameReport = row['Criteria'];
var campaignName = row['CampaignName'];
var cpcBid = row['CpcBid'];
var firstPageCpc = row['FirstPageCpc'];
var firstPositionCpc = row['FirstPositionCpc'];
var topOfPageCpc = row['TopOfPageCpc'];
Logger.log('INFO')
Logger.log(keyword.getText())
Logger.log(keywordId)
Logger.log(keywordNameReport)
Logger.log(keywordIdReport + '\n')
if (keywordId === keywordIdReport)
if (firstPositionCpc && (firstPositionCpc > 0 && firstPositionCpc <= maxCPC))
var newCPC = firstPositionCpc;
else if (topOfPageCpc && (topOfPageCpc > 0 && topOfPageCpc <= maxCPC))
var newCPC = topOfPageCpc;
else if (firstPageCpc && (firstPageCpc > 0 && firstPageCpc <= maxCPC ))
var newCPC = firstPageCpc;
else
var newCPC = minCPC;
Logger.log('KeywordIdReport :' + keywordIdReport)
Logger.log('campaignName :' + campaignName)
Logger.log('CPCbid :' + cpcBid)
Logger.log('firstPositionCpc : ' + firstPositionCpc)
Logger.log('topOfPageCpc : ' + topOfPageCpc)
Logger.log('firstPageCpc : ' + firstPageCpc)
Logger.log('NewCPC : ' + newCPC + '\n')
keyword.bidding().setCpc(newCPC)
break;
var REASONABLE_TIME_TO_WAIT = 4*6000;
var MAX_RUNNING_TIME = 1*6000;
try
var scriptProperties = PropertiesService.getScriptProperties();
catch(e)
Logger.log(e)
var startRow= scriptProperties.getProperty('start_row');
for(var ii = startRow; ii <= size; ii++)
var currTime = (new Date()).getTime();
if(currTime - startTime >= MAX_RUNNING_TIME)
scriptProperties.setProperty("start_row", ii);
ScriptApp.newTrigger("runMe")
.timeBased()
.at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
.create();
break;
MccApp.select(mccAccount);
从那个函数,我可以做些什么来解决这个问题?这很奇怪,因为我可以在这个主题上找到documentation。
【问题讨论】:
您能分享带有错误消息的 Apps Script IDE 的屏幕截图吗? @AmitAgarwal 我已经修改了这个问题。是你想要的吗? 【参考方案1】:您使用的 AdWords Script 与 Google Apps 脚本不同,尽管它们共享许多 API。 Google Apps 脚本可以访问Properties Service,而 AdWords 脚本没有。证据:AdWords 脚本参考 (screenshot) 不包括脚本服务中的属性服务。
您正在使用脚本属性来存储一个数字,即当前行号。另一种方法是将其存储在电子表格中,因为 AdWords 脚本可以访问电子表格服务。所以,在脚本的开头你会有
var ss = SpreadsheetApp.openByUrl('...'); // url of some spreadsheet
var sheet = ss.getSheets()[0]; // first sheet in it
var cell = sheet.getRange("A1"); // storing the number in A1 cell
然后在脚本正文中,替换
var startRow = scriptProperties.getProperty('start_row');
由
var startRow = cell.getValue() || 1; // 1 by default
也替换
scriptProperties.setProperty("start_row", ii);
由
cell.setValue(ii);
应该这样做。
【讨论】:
有没有办法修改runMe()
使其在adwords 脚本中工作?我想过使用Queuing
作为解决方法,但我不知道怎么做?
感谢您的回答。问题是创建的电子表格需要是临时的。所以在每次迭代中,脚本首先被创建并在最后被删除。你能解决这个问题吗?
Apps 脚本无法删除文件。而且我认为电子表格没有任何必要是临时的。处理完所有行后,只需将存储的数字重置为 1。
好的,而且 Adwords 也不支持 ScriptApp
。你有解决方案吗?
没有。如果没有 ScriptApp,您将无法创建触发器,因此根本无法使用此方法。抱歉,您必须重新考虑您的报告生成方法,以使其在允许的时间内运行。将数据分成几部分,或随机采样,或其他方式。以上是关于ReferenceError:未定义“PropertiesService”的主要内容,如果未能解决你的问题,请参考以下文章
打字稿 - 未捕获的 ReferenceError:未定义导出
JavaScript Uncaught ReferenceError: jQuery is not defined;未捕获的 ReferenceError:$ 未定义 [重复]