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

谷歌广告脚本:无法创建CSV字符串的Blob。在对象Utilities上获取方法或属性newBlob时出现意外错误

  •  1
  • MrChadMWood  · 技术社区  · 2 年前

    我一直在做这个谷歌广告脚本,通过电子邮件向我发送csv。 它查询广告词api中的数据,将其写入电子表格,从电子表格中读取数据,遍历行以创建csv字符串,创建blob并发送电子邮件。

    它写入/读取电子表格的原因是为了获得正确格式的数据。我不确定还有更好的办法。

    问题是它不会创建blob。它失败,并出现以下错误:

    Exception: Unexpected error while getting the method or property newBlob on object Utilities. (line 53)
    

    我在网上查了一下,找不到太多关于这个错误的信息。我已经尝试删除newBlob语句上的参数,发送原始csv字符串等。似乎什么都不起作用,我不明白创建blob失败的原因。

    const SS_ID = '1_super_secret_id_Q';
    const SS_NAME = 'GCLID Report';
    const SHEET_NAME = 'DURING YESTERDAY'
    const EMAIL_TO = 'c_super_secret_email_g'
    
    const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
    
    function collect_report() {
      return AdsApp.report(
        'SELECT                ' +
        '  click_view.gclid,   ' +
        '  segments.date,      ' +
        '  customer.id,        ' +
        '  ad_group.id,        ' +
        '  campaign.id         ' +
        'FROM click_view       ' +
        'WHERE segments.date DURING YESTERDAY'
      );
    }
    
    function calculate_yesterday() {
      var now = new Date();
      var yesterday = new Date(now.getTime() - MILLIS_PER_DAY);
      var timeZone = AdsApp.currentAccount().getTimeZone();
      var yesterday_str = Utilities.formatDate(yesterday, timeZone, 'yyyy-MM-dd');
      return yesterday_str;
    }
    
    function convert_sheet_to_csv(sheet) {
      var csv_data = '';
      
      // This represents ALL the data.
      var range = sheet.getDataRange();
      var values = range.getValues();
    
      // This logs the spreadsheet in CSV format.
      for (let i = 0; i < values.length; i++) {
        csv_data += (values[i].join(',')) + '\r\n';
      }
    }
    
    function main() {
      var report = collect_report();
      var spreadsheet = SpreadsheetApp.openById(SS_ID);
      var sheet = spreadsheet.getSheetByName(SHEET_NAME);
      
      sheet.clearContents();
      report.exportToSheet(sheet);
    
      var mime = 'text/plain'
      var yesterday_str = calculate_yesterday();
      var filename = 'gclid_report.csv';
      var csv_data = convert_sheet_to_csv(sheet);
      var blob = Utilities.newBlob(csv_data, mime, filename);
    
    
      var email_subject = 'Your Google Ads Report Is Ready: GCLID Report';
      var email_body = 'Attached is the ' + filename;
    
      MailApp.sendEmail(
        EMAIL_TO,
        email_subject,
        email_body,
        {
            name: 'Automatic Emailer Script',
            attachments: [blob]
        }
      );
    }
    
    main();
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Tanaike    2 年前

    当我看到你的脚本时,似乎函数 convert_sheet_to_csv 不返回任何值。由此, csv_data 属于 var csv_data = convert_sheet_to_csv(sheet); 未定义。我以为这就是你现在这期的原因 Exception: Unexpected error while getting the method or property newBlob on object Utilities. .在这种情况下,下面的修改如何?

    修改的脚本:

    在该修改中, 转换表单到csv 修改如下。

    function convert_sheet_to_csv(sheet) {
      var csv_data = '';
      
      // This represents ALL the data.
      var range = sheet.getDataRange();
      var values = range.getValues();
    
      // This logs the spreadsheet in CSV format.
      for (let i = 0; i < values.length; i++) {
        csv_data += (values[i].join(',')) + '\r\n';
      }
      
      return csv_data; // Added
    }
    
    • 由此, csv_data公司 属于 var csv_data=convert_sheet_to_csv(表); 具有字符串值。和 var blob = Utilities.newBlob(csv_data, mime, filename); 作品