Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查一个区域的列标题,并对另一个区域的单元格进行操作_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 检查一个区域的列标题,并对另一个区域的单元格进行操作

Javascript 检查一个区域的列标题,并对另一个区域的单元格进行操作,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有两个命名范围DbCrHdr和事务 我想通过事务进行解析,如果单元格的列索引或列索引与DbCrHdr数组上的“credit”匹配,那么我想将该数字转换为负数或乘以-1,然后将该数组重新映射/重新馈送到事务,从而改变工作表 我如何才能做到这一点 附加的谷歌应用程序脚本文件 /** @OnlyCurrentDoc */ // Global Variables // Set ss to active spreadsheet var SS = SpreadsheetApp.getActiveS

我有两个命名范围<代码>DbCrHdr和
事务
我想通过
事务
进行解析,如果单元格的列索引或列索引与
DbCrHdr
数组上的“credit”匹配,那么我想将该数字转换为负数或乘以-1,然后将该数组重新映射/重新馈送到
事务
,从而改变工作表

我如何才能做到这一点

附加的谷歌应用程序脚本文件

/** @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])

    }
  }
}
/**@仅限当前文档*/
//全局变量
//将ss设置为活动电子表格
var SS=SpreadsheetApp.getActiveSpreadsheet();
//将图纸设置为当前活动图纸
var Sheet=SS.getActiveSheet();
//获取当前图纸名称并将其设置为sheetName
var SheetName=Sheet.getName();
//按名称获取范围并将其设置为全局变量
var TransxnRange=SpreadsheetApp.getActive().getRangeByName(“交易”);
//获取搜索范围中的值数组
var TransxnValues=TransxnRange.getValues();
//按名称获取范围并将其设置为全局变量
var DbCrRange=SpreadsheetApp.getActive().getRangeByName(“DbCrHdr”);
//获取搜索范围中的值数组
var DbCrValues=DbCrRange.getValues();
/**
*分析借方-贷方行,如果标题为贷方,则将货币更改为负数。
* 
* 
*/
函数negativerEdit(){
var LastCol=TransxnRange.getLastColumn();
var LastRow=TransxnRange.getLastRow();
var NumCol=TransxnRange.getNumColumns();
var NumRow=TransxnRange.getNumRows();
/**
Logger.log(LastCol)
Logger.log(最后一行)
Logger.log(NumCol)
Logger.log(NumRow)
Logger.log(TransxnRange.getA1Notation())
Logger.log(transxn值)
Logger.log(DbCrRange.getA1Notation())
Logger.log(DbCrValues)
*/
TransxnValues.forEach(函数(行){
行。forEach(函数(列){
//Logger.log(col);
});
});
对于(i=0;i
说明: 您的目标是找到列索引,其中
credit
出现在
DbCrValues
的第一行中:

creditIndexes = DbCrValues.flat().flatMap((cr, i) => cr === 'credit' ? i : []);
然后在
creditindex
中的列索引检查每一行

如果行和值为正,则将符号更改为负:

creditIndexes.forEach(col=>{
     TransxnValues.forEach((row,ir)=>{  
       let val = row[col];
       TransxnValues[ir][col] = val > 0 && !Number.isNaN(val) ? -val : val;
     });
});
否则,保留现有值

解决方案: 保留全局偏差并将
negativerEdit()
更改为:

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);  
}
其他参考资料:


有没有办法让此功能在后台运行?或者,如果我将它添加到函数onOpen()下,它会多少实现这个目标?谢谢你,顺便说一句。@sle7en是的,两者都做是安全的。如果函数运行多次,则不会出现任何问题。您可以创建一个时间驱动触发器以每次刷新它,也可以在
onOpen
触发器中输入,以便每次刷新电子表格(刷新网页)时都会触发该功能。我认为第二个更合理,但最终的决定是你的。@sle7en对于后者,你可以有这样的东西:
函数onOpen(){NegativeCredit();}
NegativeCredit
将在你每次打开电子表格文件时触发。可爱的,谢谢一个束人,会按照你的建议使用后者