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:未定义导出

ReferenceError: $ 未定义

ReferenceError:未定义 DartObject

ReferenceError:未定义解析

JavaScript Uncaught ReferenceError: jQuery is not defined;未捕获的 ReferenceError:$ 未定义 [重复]

ReferenceError:产品未定义