谷歌表格脚本返回#NAME?

Posted

技术标签:

【中文标题】谷歌表格脚本返回#NAME?【英文标题】:Google Sheet Script Returning #NAME? 【发布时间】:2019-07-12 00:02:24 【问题描述】:

我设置了一个脚本来将 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]);
  ;

【问题讨论】:

【参考方案1】:

这是我的猜测

使用 Google 表格 UI 打开电子表格时会加载 Google 表格自定义函数定义,然后计算公式,并且由于自定义函数已定义,因此它们会被正确计算。如果未以这种方式打开电子表格,则不会加载自定义函数定义,因此电子表格不知道如何处理该函数并返回 #NAME?

如果您已经在运行更新某些值的脚本,请增强该脚本以执行您的自定义函数的计算。

【讨论】:

据我所知,当电子表格关闭时,公式仍然有效。我什至从脚本中添加了公式,另一个仍然得到正确的值。我仍在调查此事。 感谢您的建议。我可以确认关闭工作表后公式继续有效,因为记录值的脚本一直在正常工作并记录一夜之间发生变化的 API 值。我认为 Google Ads 访问工作表的问题更多,也许它没有给工作表足够长的时间来正确加载。 @apit 请更新您的问题以包括您如何检查包括自定义函数在内的公式在工作表关闭时是否继续工作。 @Rubén 我已在问题末尾添加了它。它记录了使用 API 自定义函数的单元格的值,并将其添加为下面的新行。【参考方案2】:

尝试转换这个

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

进入这个:

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

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

【讨论】:

公式为 =TheLottAPI("Powerball","Div1Amount",Attributes!K4) 当工作表打开和关闭时它工作正常,但当 Google Ads 尝试访问工作表时就不行了。跨度>

以上是关于谷歌表格脚本返回#NAME?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌表格应用脚本 toLocaleString 返回 M01 而不是一月

如何从谷歌表格中获取评论

Folders.hasNext()从Google表格中返回false,但直接从Google Script调用时为true

谷歌表格(公式) - 如果一个单元格等于某个值,它将向相邻单元格返回另一个值

谷歌电子表格查询:我可以删除列标题吗?

使用 AppS 脚本返回 Google 表格单元格的绝对值