javascript - 检查一个范围的列标题并对另一个范围的单元格进行操作
问题描述
我有 2 个命名范围;DbCrHdr
&Transactions
我想解析Transactions
,如果单元格的列索引或列索引与DbCrHdr
数组上的“信用”匹配,那么我想将该数字变为负数或乘以-1,并将该数组重新映射/重新输入Transactions
, 改变工作表。
我怎样才能实现这一目标?
附加的谷歌应用脚本文件;
/** @OnlyCurrentDoc */
// Global Variables
// Set ss to active spreadsheet
var SS = SpreadsheetApp.getActiveSpreadsheet();
// Set sheet to the current active sheet
var Sheet = SS.getActiveSheet();
// Get current sheet name and set it to sheetName
var SheetName = Sheet.getName();
// Get range by name and set it to a global variable
var TransxnRange = SpreadsheetApp.getActive().getRangeByName("Transactions");
// Get array of values in the search Range
var TransxnValues = TransxnRange.getValues();
// Get range by name and set it to a global variable
var DbCrRange = SpreadsheetApp.getActive().getRangeByName("DbCrHdr");
// Get array of values in the search Range
var DbCrValues = DbCrRange.getValues();
/**
* Parse through the debit-credit row and change the currency to negative if the header is credit.
*
*
*/
function NegativeCredit() {
var LastCol = TransxnRange.getLastColumn();
var LastRow = TransxnRange.getLastRow();
var NumCol = TransxnRange.getNumColumns();
var NumRow = TransxnRange.getNumRows();
/**
Logger.log(LastCol)
Logger.log(LastRow)
Logger.log(NumCol)
Logger.log(NumRow)
Logger.log(TransxnRange.getA1Notation())
Logger.log(TransxnValues)
Logger.log(DbCrRange.getA1Notation())
Logger.log(DbCrValues)
*/
TransxnValues.forEach(function(row) {
row.forEach(function(col) {
// Logger.log(col);
});
});
for ( i = 0; i < NumCol; i++) {
for ( j = 0; j < NumRow; j++) {
Logger.log(TransxnValues[j][i])
}
}
}
解决方案
解释:
您的目标是找到credit
出现在第一行的列索引DbCrValues
:
creditIndexes = DbCrValues.flat().flatMap((cr, i) => cr === 'credit' ? i : []);
然后forEach列索引creditIndexes
检查每一行。
如果该行是数字且值为正,则将符号更改为减号:
creditIndexes.forEach(col=>{
TransxnValues.forEach((row,ir)=>{
let val = row[col];
TransxnValues[ir][col] = val > 0 && !Number.isNaN(val) ? -val : val;
});
});
否则,保留现有值。
解决方案:
保留全局声明并更改NegativeCredit()
为:
function NegativeCredit() {
const creditIndexes = DbCrValues.flat().flatMap((cr, i) => cr === 'credit' ? i : []);
creditIndexes.forEach(col=>{
TransxnValues.forEach((row,ir)=>{
let val = row[col];
TransxnValues[ir][col] = val > 0 && !Number.isNaN(val) ? -val : val;
});
});
TransxnRange.setValues(TransxnValues);
}
其他参考:
推荐阅读
- javascript - 降级的 Angular 6 组件(到 AngularJS 1.6.9)不呈现 UI
- wordpress - 简单的 301 .htaccess 重定向在 Wordpress 上创建无限重定向
- python - tkinter.filedialog 上的官方文档
- swift - 当我的应用程序状态为后台时,pushkit 会发送通知。如何使应用状态处于活动状态?
- delphi - 无法在 Delphi 10.2 中将 char 数组分配给字符串
- python - 如何在python 3.7中的aa Tk画布内创建一个按钮
- javascript - 以响应方式将 Highcharts 工具提示置于圆环图中间
- php - 通过 PHP 和 Laravel if 语句的暗模式
- android - 从输入流下载图像显示损坏的图像
- c# - 如何在 C# 中生成带有向下旋转 90 度的字母的 Excel 文件?