1

我正在尝试将具有相同标识的 2 行组合起来。我一直在寻找解决方案,但不知何故找不到可行的解决方案。我正在尝试为我的股票制作跟踪器,但如果我添加相同的资产,我希望它能够结合信息。我制作了一个表格,可以将交易添加到投资组合中。因此,如果存在重复资产,则新副本将始终位于最后一行。

我既不是编程专家,也不是谷歌表格专家,但这是伪代码:

  • 检查第 2 列(资产 ID)中是否有重复项,如果有:
  • 将最后一行的第 1 列中的值复制到现有行(它是购买日期的列);
  • 资产的 ID 在第 2 列中,因此可以保持不变;
  • 金额在第 3 列,它应该将最后一行的金额添加到现有行第 3 列。

这是一个示例表:https ://docs.google.com/spreadsheets/d/1AEdljHtXUOnRJ1kxbziqKAjYo5EqGZjjnWOx1mbeTI0/edit#gid=0

我尝试了几件事,但我被卡住了。我已经编写了一个代码来遍历数据,找到重复项并将其添加到列表中。但在那之后,我只是不知道如何去做。

你可能会嘲笑我的代码,但从某个角度来看,它就像在兜圈子。


function readData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var formSS = ss.getSheetByName("Portfolio");
  var rangeArray = formSS.getRange("B2:B" + formSS.getLastRow()).getValues(); //makes an array of values from column B, but each item  is in array in itself.
  rangeArray = [].concat.apply([],rangeArray);//takes the elements outside their own array;
  var sortedRangeArray = rangeArray.sort();//sort the items to a new array
  duplicates=[];//make a list of duplicates to identify
  for (var i =0; i < 1;sortedRangeArray.length, i++)//iterate through sortedArray
    if(sortedRangeArray[i+1] === sortedRangeArray[i]){
      duplicates.push(sortedRangeArray[i]);//if a duplicate is found, push it to the duplicates list
    }
  var str = duplicates[0];//identify the duplicate, there is only one anyway.
  for (var k = 0; k < sortedRangeArray.length; k++) {
    var row = sortedRangeArray[k];
    if(row[SEARCH_COL_IDX] == str) {
      var index = rangeArray.findIndex(str);//I thought it might help defining the position
}}}``` 

4

2 回答 2

2

它可能是这样的:

function main() {
  var table = SpreadsheetApp.getActiveSheet().getDataRange().getValues();

  var ids = table.map(x => x[1]);     // get array of IDs (column B)
  var row = ids.indexOf(ids.pop());   // find ID from last row in the array
  if (row == -1) return;              // if not found do nothing

  var value = table[row][2];          // get value of 3rd cell
  table[row] = table.pop();           // move the last row in current row
  table[row][2] += value;             // add the value to 3rd cell
  table.push(Array(table[0].length)); // add empty row to the table

  SpreadsheetApp.getActiveSheet().getDataRange().setValues(table); // put the table back on the sheet
}

更新

由于您的表包含公式,因此需要稍微另一种实现:

function main() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var table = sheet.getDataRange().getValues();

  var ids = table.map(x => x[1]);     // get array of IDs (column B)
  var row = ids.indexOf(ids.pop());   // find ID from last row in the array
  if (row == -1) return;              // if not found do nothing
  
  var last_row = table.pop();

  var date  = last_row[0];
  var id    = last_row[1];
  var value = last_row[2] + table[row][2];

  sheet.getRange(row+1,1,1,3).setValues([[date,id,value]]);

  sheet.getRange(sheet.getLastRow(),1,1,8).clearContent();
}
于 2021-09-25T21:57:43.923 回答
1

假设这些是您的标题 [金额,ID,新金额]

  function run(){
    const ACTIVE = SpreadsheetApp.getActive()
    const allRows = ACTIVE.getDataRange().getValues()
    const lastRow = allRows.pop()

    // Id is in column B
    const recordId = lastRow[1]
    // Amount is in column A
    const amount = lastRow[0]
  
    // Remove row 1, I assume there are only headers
    allRows.shift()

    // Look through every row in Column B for a match
    allRows.forEach( (row, index) => {
      if( row[1] == recordId ){
        // Create a new amount
        const newAmount = amount + parseInt(row[0])
        ACTIVE.getRange(index+2, 3).setValue(newAmount)
      }
    })
  }
于 2021-09-25T16:10:45.153 回答