Google 应用程序脚本:为空单元格分配零
Google app scripts: Assign zero for empty cells
我是 Google Apps 脚本的新手,试图根据列的当前值和标志为列设置值。
如果 Flag = Y,则将 C1 中的值下限:
C1 列值=23.9895
期望值=23
如果 Flag = N 则舍入 C1 中的现有值:
C1 列值=23.9895
期望值=24
如果标志是 Y 或 N 则写入 0:
C1 列值=空单元格
期望值=0
我已经实现了下面的代码。它正在部分工作。前两个场景工作正常,但第三个场景失败。
当我尝试设置为零时,出现 #NUM!
错误而不是零。不知道该怎么做。
...
do {
sRange = "Q" + iCt;
if ((gDecimalInPrice == "Y") && (!isNaN(sheet.getRange(sRange).getValue()))) {
sheet.getRange(sRange).setValue(Math.abs(parseInt(sheet.getRange(sRange).getValue())));
} else if ((gDecimalInPrice == "N") && (!isNaN(sheet.getRange(sRange).getValue()))) {
sheet.getRange(sRange).setValue(Math.abs(Math.round(sheet.getRange(sRange).getValue())));
} else {
sheet.getRange(sRange).setValue(sheet.getRange(sRange).getValue());
}
iCt = iCt + 1;
} while (iCt <= gRowCt);
通过批处理操作执行此操作要快得多(并遵循 official best practices). These read the values into a "2D" JavaScript array (an array of arrays of values), and then you can do all your logic in memory, rather than repeatedly requesting data from the
function foo() {
const wb = SpreadsheetApp.getActive();
const sheet = wb.getSheetByName("the sheet name");
if (!sheet) throw new Error("Sheet with that name is missing");
const lastRow = sheet.getLastRow();
const flags = sheet.getRange("A1:A" + lastRow).getValues();
const valueRange = sheet.getRange("Q1:Q" + lastRow);
const newValues = valueRange.getValues().map(function (row, i) {
return row.map(function (value) {
var flag = flags[i][0];
if (!flag || (value && isNaN(value))) // No "Y" or "N", or value is non-nullstring non-number, so return value as-is
return value;
else if (flag === "Y")
return value ? Math.floor(parseFloat(value)) : 0;
else if (flag === "N")
return value ? Math.round(parseFloat(value)) : 0;
else // Unknown flag value
return value;
});
});
// Write all processed values at once
valueRange.setValues(newValues);
}
与往常一样,您应该通过查看 Stackdriver 日志(可通过脚本编辑器的 "View" 菜单访问)来监控宏和触发函数是否有错误。
我是 Google Apps 脚本的新手,试图根据列的当前值和标志为列设置值。
如果 Flag = Y,则将 C1 中的值下限:
C1 列值=23.9895
期望值=23如果 Flag = N 则舍入 C1 中的现有值:
C1 列值=23.9895
期望值=24如果标志是 Y 或 N 则写入 0:
C1 列值=空单元格
期望值=0
我已经实现了下面的代码。它正在部分工作。前两个场景工作正常,但第三个场景失败。
当我尝试设置为零时,出现 #NUM!
错误而不是零。不知道该怎么做。
...
do {
sRange = "Q" + iCt;
if ((gDecimalInPrice == "Y") && (!isNaN(sheet.getRange(sRange).getValue()))) {
sheet.getRange(sRange).setValue(Math.abs(parseInt(sheet.getRange(sRange).getValue())));
} else if ((gDecimalInPrice == "N") && (!isNaN(sheet.getRange(sRange).getValue()))) {
sheet.getRange(sRange).setValue(Math.abs(Math.round(sheet.getRange(sRange).getValue())));
} else {
sheet.getRange(sRange).setValue(sheet.getRange(sRange).getValue());
}
iCt = iCt + 1;
} while (iCt <= gRowCt);
通过批处理操作执行此操作要快得多(并遵循 official best practices). These read the values into a "2D" JavaScript array (an array of arrays of values), and then you can do all your logic in memory, rather than repeatedly requesting data from the
function foo() {
const wb = SpreadsheetApp.getActive();
const sheet = wb.getSheetByName("the sheet name");
if (!sheet) throw new Error("Sheet with that name is missing");
const lastRow = sheet.getLastRow();
const flags = sheet.getRange("A1:A" + lastRow).getValues();
const valueRange = sheet.getRange("Q1:Q" + lastRow);
const newValues = valueRange.getValues().map(function (row, i) {
return row.map(function (value) {
var flag = flags[i][0];
if (!flag || (value && isNaN(value))) // No "Y" or "N", or value is non-nullstring non-number, so return value as-is
return value;
else if (flag === "Y")
return value ? Math.floor(parseFloat(value)) : 0;
else if (flag === "N")
return value ? Math.round(parseFloat(value)) : 0;
else // Unknown flag value
return value;
});
});
// Write all processed values at once
valueRange.setValues(newValues);
}
与往常一样,您应该通过查看 Stackdriver 日志(可通过脚本编辑器的 "View" 菜单访问)来监控宏和触发函数是否有错误。