我有多张具有相同格式(页眉(的纸张。
-
Cost_Tmp:通过数组形式函数从原始数据计算成本
-
成本:如果Cost_tmp更改并且>成本,然后我想将值从Cost_Tmp复制到成本。
-
我有多页,所以我会使用数组来加快脚本处理
-
列索引可以更改->我想用列标题来指代列。
-
我写了这段代码来做到这一点,但它不起作用(复制函数起作用,但如果函数不起作用的话(。我不知道如何比较数组的2个对象值。问题是如果功能低于
-
如果(data[i][Cost_Tmp_col]>data[i][Cost_col].toString(((
-
以下是示例表:谷歌测试表
function updateCost() {
var mysheetname = ["RETAIL_ORDER","SEA FOOD_ORDER","HAMPER_ORDER","GARDEN_ORDER"];
for(var j = 0;j < mysheetname.length;j++)
{
var sheet = SpreadsheetApp.getActive().getSheetByName(mysheetname[j]);
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
var Cost_col = headers.indexOf('Cost');
var Cost_Tmp_col = headers.indexOf('Cost_Tmp');
var dataRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mysheetname[j])
.getDataRange();
var CostRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mysheetname[j])
.getRange(1,Cost_col+1,sheet.getLastRow(),1);
var data = dataRange.getValues();
var newData = []
for (var i = 0; i < data.length; i++) {
var cost_tmp_val = data[i][Cost_Tmp_col];
if (data[i][Cost_Tmp_col] > data[i][Cost_col].toString()) {
data[i][Cost_col] = data[i][Cost_Tmp_col].toString();
}
newData.push(new Array(data[i][Cost_col]));
}
CostRange.setValues(newData);
}
}
问题:
- 您想要比较两个数字,但(至少(比较中的一个项目是字符串
data[i][Cost_col].toString()
。如果要比较数字,请不要使用toString(( - 仅当满足条件时,才将值推送到
newData
,而希望填充所有Cost
列(而不仅仅是必须更新的行( - 构造函数
new Array(number)
将创建一个具有数字长度的空数组。这不是你想要实现的
解决方案:
- 如果要比较数字,请不要使用toString((
- 检索对应于
CostRange
的值并修改这些值,而不是通过newData
创建新的数组
代码示例:
function updateCost() {
var mysheetname = ["RETAIL_ORDER","SEA FOOD_ORDER","HAMPER_ORDER","GARDEN_ORDER"];
for(var j = 0;j < mysheetname.length;j++) {
var sheetname = mysheetname[j];
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetname);
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
var Cost_col = headers.indexOf('Cost') + 1;
var Cost_Tmp_col = headers.indexOf('Cost_Tmp') + 1;
var dataRange = sheet.getDataRange();
var CostRange = sheet.getRange(1,Cost_col,sheet.getLastRow(),1);
var costValues = CostRange.getValues();
var data = dataRange.getValues();
for (var i = 1; i < data.length; i++) {
var rowData = data[i];
var costTemp = rowData[Cost_Tmp_col - 1];
if (costTemp > rowData[Cost_col - 1]) {
costValues[i] = [costTemp];
}
}
CostRange.setValues(costValues);
}
}
注:
- 为了避免重复任务(例如多次访问
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mysheetname[j])
或data[i]
(,我修改了您的脚本 - 我假设在编辑电子表格时触发它不是问题,而只是让脚本执行适当的操作。如果您需要帮助,请查看onEdit