Google 工作表自定义函数错误 "Result was not a number"
Google sheets custom function error "Result was not a number"
我有一个 Google Sheets Apps Script 自定义函数产生错误:"Result was not a number"。来自自定义函数的值 return 尽管数字未被视为数字,但无论 'format' 应用于单元格如何。计算出的值不能用于其他内置函数,例如 SUM()。
有人问过类似的问题,请参阅 , , and here(可能还有其他...),但没有解释如何更改 return 类型。
DataTypes 的 google apps-script documentation 不清楚如何 "force" 您的自定义函数到特定 return 类型。
Link 使用脚本举例 sheet。
这是我遇到问题的函数(注意 getCell() 不包括在下面):
/**
Sum all transactions across sheets that match category and date range.
@param category_name The category to filter on
@param date_min Minimum date in range to filter
@param date_max Maximum Date in range to filter
@param [time] Optional update time/date
@return The sum of transactions that match input criteria
@customfunction
*/
function sumCategory(category_name, date_min, date_max, time) {
var date_min = new Date(date_min);
var date_max = new Date(date_max);
var date_month = date_min.getMonth();
var date_year = date_min.getYear();
var sheets = ['Account1', 'Account2'];
var column_name = {
Date: "Date",
Category: "Category",
Amount: "Amount"
};
var msg = "";
var sum = 0.0;
var spreadsheet = SpreadsheetApp.getActive();
// Number of seconds before the cache expires.
var cache_time = 120;
var cache = CacheService.getScriptCache();
// Build the cache key with requested category_year_month
var cache_key = category_name + '_' + date_year.toString() + '_' + date_month.toString();
// If we have this category cached, then return it...
var cached = cache.get(cache_key);
if (cached != null) {
return cached;
}
// Category sum for cache
var cat_sum = { };
// Loop through all sheets, and all transactions building the category sum cache
for(var x = 0; x < sheets.length; x++){
var s = sheets[x];
//Browser.msgBox("Working on sheet: " + s);
var cur_sheet = spreadsheet.getSheetByName(s);
// Get data range for whole sheet
var data = cur_sheet.getDataRange();
var num_rows = data.getNumRows();
var num_cols = data.getNumColumns();
// Loop through all rows in this sheet
for(var i = 2; i < num_rows; i++){
var xdate = new Date(getCell(column_name.Date, i, data));
var cat = getCell(column_name.Category, i, data);
var amount = getCell(column_name.Amount, i, data);
// If the transaction category is empty, set to 'Uncategorized'
if(!cat){
cat = "Uncategorized";
}
var xkey = cat + '_' + xdate.getYear().toString() + '_' + xdate.getMonth().toString();
// Check if we have not already stored this category
if(!cat_sum.hasOwnProperty(xkey)){
// initialize
cat_sum[xkey] = 0.0;
}
cat_sum[xkey] = cat_sum[xkey] + parseFloat(amount);
}// end loop rows
}// end loop sheets
// Build cache
for (var key in cat_sum){
//console.log( key, dict[key] );
cache.put(key, cat_sum[key], cache_time);
}
// If category not found... set to 0.
if(!cat_sum[cache_key]){
cat_sum[cache_key] = 0.0;
cache.put(cache_key, 0.0, cache_time);
}
var return_value = cat_sum[cache_key];
// Return the requested category sum
return return_value;
}
Javascript 和 Google apps-script 不提供将 'force' return 类型转换为自定义函数数字的方法。
答案接近但 return 类型是数组,而不是数字。
此 的答案是正确的,但没有示例说明如何强制 return 值的正确类型。
这个 link 包含将 Javascript 字符串转换为数字的示例,并列出了一些陷阱。
为了'force'把return给一个数,
添加 return Number(cached);
和
return Number(return_value);
到函数。
带有脚本的示例 sheet 已更新为 return 一个数字。
Here 是带有脚本代码的 JSFiddle。
我有一个 Google Sheets Apps Script 自定义函数产生错误:"Result was not a number"。来自自定义函数的值 return 尽管数字未被视为数字,但无论 'format' 应用于单元格如何。计算出的值不能用于其他内置函数,例如 SUM()。
有人问过类似的问题,请参阅
DataTypes 的 google apps-script documentation 不清楚如何 "force" 您的自定义函数到特定 return 类型。
Link 使用脚本举例 sheet。
这是我遇到问题的函数(注意 getCell() 不包括在下面):
/**
Sum all transactions across sheets that match category and date range.
@param category_name The category to filter on
@param date_min Minimum date in range to filter
@param date_max Maximum Date in range to filter
@param [time] Optional update time/date
@return The sum of transactions that match input criteria
@customfunction
*/
function sumCategory(category_name, date_min, date_max, time) {
var date_min = new Date(date_min);
var date_max = new Date(date_max);
var date_month = date_min.getMonth();
var date_year = date_min.getYear();
var sheets = ['Account1', 'Account2'];
var column_name = {
Date: "Date",
Category: "Category",
Amount: "Amount"
};
var msg = "";
var sum = 0.0;
var spreadsheet = SpreadsheetApp.getActive();
// Number of seconds before the cache expires.
var cache_time = 120;
var cache = CacheService.getScriptCache();
// Build the cache key with requested category_year_month
var cache_key = category_name + '_' + date_year.toString() + '_' + date_month.toString();
// If we have this category cached, then return it...
var cached = cache.get(cache_key);
if (cached != null) {
return cached;
}
// Category sum for cache
var cat_sum = { };
// Loop through all sheets, and all transactions building the category sum cache
for(var x = 0; x < sheets.length; x++){
var s = sheets[x];
//Browser.msgBox("Working on sheet: " + s);
var cur_sheet = spreadsheet.getSheetByName(s);
// Get data range for whole sheet
var data = cur_sheet.getDataRange();
var num_rows = data.getNumRows();
var num_cols = data.getNumColumns();
// Loop through all rows in this sheet
for(var i = 2; i < num_rows; i++){
var xdate = new Date(getCell(column_name.Date, i, data));
var cat = getCell(column_name.Category, i, data);
var amount = getCell(column_name.Amount, i, data);
// If the transaction category is empty, set to 'Uncategorized'
if(!cat){
cat = "Uncategorized";
}
var xkey = cat + '_' + xdate.getYear().toString() + '_' + xdate.getMonth().toString();
// Check if we have not already stored this category
if(!cat_sum.hasOwnProperty(xkey)){
// initialize
cat_sum[xkey] = 0.0;
}
cat_sum[xkey] = cat_sum[xkey] + parseFloat(amount);
}// end loop rows
}// end loop sheets
// Build cache
for (var key in cat_sum){
//console.log( key, dict[key] );
cache.put(key, cat_sum[key], cache_time);
}
// If category not found... set to 0.
if(!cat_sum[cache_key]){
cat_sum[cache_key] = 0.0;
cache.put(cache_key, 0.0, cache_time);
}
var return_value = cat_sum[cache_key];
// Return the requested category sum
return return_value;
}
Javascript 和 Google apps-script 不提供将 'force' return 类型转换为自定义函数数字的方法。
此
这个 link 包含将 Javascript 字符串转换为数字的示例,并列出了一些陷阱。
为了'force'把return给一个数,
添加 return Number(cached);
和
return Number(return_value);
到函数。
带有脚本的示例 sheet 已更新为 return 一个数字。
Here 是带有脚本代码的 JSFiddle。