首页 > 解决方案 > 检查一个范围的列标题并对另一个范围的单元格进行操作

问题描述

我有 2 个命名范围;DbCrHdrTransactions 我想解析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])

    }
  }
}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释:

您的目标是找到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);  
}

其他参考:


推荐阅读