Google表格脚本返回#NAME吗?

时间:2019-07-12 00:02:24

标签: google-apps-script google-sheets google-adwords custom-function

我已经设置了一个脚本,可以将数据从JSON API提取到Google表格中。我通过添加第三个参数来刷新它,该参数在API调用中未使用,但链接到另一个脚本将当前时间添加到的单元格。这样可以确保定期调用API。

然后我们将使用此Google表格将数据输入到Google Ads。

这一切似乎都能正常运行,但是,当工作表关闭了一段时间(例如整夜)并且Google Ads尝试从工作表进行更新时,它会导入#NAME吗?而不是正确的API值。

我已经设置了另一个脚本,该脚本定期记录API值。这似乎正确记录了这些值,表明关闭工作表时API调用正在工作。

// Make a POST request with a JSON payload.
// Datetime parameter isn't use in API call but is used to refresh data

function TheLottAPI(game,attribute,datetime) {

var data = {
  'CompanyId': 'GoldenCasket',
  'MaxDrawCount': 1,
  'OptionalProductFilter': [game]};

    Logger.log(data);  

var options = {
  'method' : 'post',
  'contentType': 'application/json',
  // Convert the JavaScript object to a JSON string.
  'payload' : JSON.stringify(data)};

  var response = UrlFetchApp.fetch('https://data.api.thelott.com/sales/vmax/web/data/lotto/opendraws', options);

  Logger.log('output: '+ response);          

  // Convert JSON response into list
  var json = JSON.parse(response)
 var drawList=json ["Draws"];

  // Extract attribute from list
 for(var i=0;i<drawList.length;i++)
{var value=drawList[i][attribute];} 
  Logger.log(value)

  return value;
  SpreadsheetApp.flush();
};


// Set date & time to refresh API call

function RefreshTime() {
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());
}

应该显示来自API的正确数值,而不是#NAME?错误。

我已经通过使用另一个脚本复制当前值来检查API调用是否正常运行。该API将在一夜之间的适当时间更新。

 function RecordDraws() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Draw Amounts");
  var source = sheet.getRange("A3:D3");
  var values = source.getValues();

  values[0];
  sheet.appendRow(values[0]);
  };

2 个答案:

答案 0 :(得分:0)

这是我的猜测

使用Google Sheets UI打开电子表格时,将加载Google Sheets自定义函数定义,然后计算公式,并且由于已经定义了自定义函数,因此可以正确计算它们。如果未以这种方式打开电子表格,则不会加载自定义功能定义,因此电子表格不知道该使用该功能做什么并返回#NAME?

如果您已经在运行更新某些值的脚本,请对该脚本进行增强以执行符合您的自定义功能的计算。

答案 1 :(得分:0)

尝试将其转换

 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());

对此:

 SpreadsheetApp.openById("id").getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());

因为关闭电子表格或从API调用该方法时,我认为没有“活动表格”。