【问题标题】:How to Copy Data from One Google Sheet to Another Sheet at the next blank row如何将数据从一个 Google 工作表复制到下一个空白行的另一个工作表
【发布时间】:2021-10-12 14:00:45
【问题描述】:

我对 Google 表格不太熟悉。我正在使用来自 Internet 的模板,以便在查看 youtube 视频后使其可用。这是我的 Google 表格的链接。 https://docs.google.com/spreadsheets/d/1KD_qFT6J6ife72OhQRzr0pHSiyyRNA3X8KCDTc2A-iE/edit?usp=sharing

我在做什么。 1- 我从财务中复制数据并将其粘贴到“历史记录”选项卡中。 2-然后我根据“BNB”、“BTC”等选项卡名称过滤数据,并将特定的过滤数据粘贴到该特定工作表中。 真的是花时间工作,让我很累。我想自动化整个过程,只需单击“填充数据”按钮,数据就会自动填充到所有工作表中。是否有可能做到这一点?如果是,那么请指导我如何做到这一点?谢谢

【问题讨论】:

  • 谁能给我建议怎么做?

标签: google-apps-script google-sheets scripting


【解决方案1】:

任务看起来很简单。作为最简单的幼稚解决方案,您可以尝试扩展此示例:

function copy_rows_from_history() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // get data from 'History1'
  var s = ss.getSheetByName('History1');
  var data = s.getRange(1,1,s.getLastRow(),8).getDisplayValues();

  // get all XPR rows from the data
  var XRP = data.filter(x => x[1] == 'XRPUSDT');

  // add the XPR rows to the 'XPR' sheet
  s = ss.getSheetByName('XRP');
  var lastRow = s.getRange('A1:A').getValues().filter(String).length;
  s.getRange(lastRow+1,1,XRP.length,XRP[0].length).setValues(XRP);

  // get all SHIB rows from the data
  var SHIB = data.filter(x => x[1] == 'SHIBUSDT');

  // add the SHIB rows to the 'SHIB' sheet
  s = ss.getSheetByName('SHIB');
  var lastRow = s.getRange('A1:A').getValues().filter(String).length;
  s.getRange(lastRow+1,1,SHIB.length,SHIB[0].length).setValues(SHIB);

  // etc...
}

当然,用一些数组(从“History1”表的第二列的值动态创建)替换这些“XPR”、“SHIB”等会更有效,并用几个循环遍历这个数组通用功能。等等。但我不确定你是否准备好深入研究 JS 编码?有时越简单越好。

脚本的完整变体在这里:

function copy_rows_from_history() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // make the object with short and full names all the markets
  const MARKETS = {};

  [ 
    ['ADAUSDT'  , 'ADA'  ], ['BNBUSDT'  , 'BNB'  ], ['BTCUSDT'  , 'BTC'  ], ['BTTUSDT'  , 'BTT'  ],
    ['CELRUSDT' , 'CELR' ], ['DENTUSDT' , 'DENT' ], ['DOGEUSDT' , 'DOGE' ], ['EOSUSDT'  , 'EOS'  ],
    ['ETHUSDT'  , 'ETH'  ], ['FTMUSDT'  , 'FTM'  ], ['LUNAUSDT' , 'LUNA' ], ['MATICUSDT', 'MATIC'],
    ['NEOUSDT'  , 'NEO'  ], ['ONGUSDT'  , 'ONG'  ], ['QTUMUSDT' , 'QTUM' ], ['SHIBUSDT' , 'SHIB' ],
    ['STRAXUSDT', 'STRAX'], ['SUNUSDT'  , 'SUN'  ], ['SUSHIUSDT', 'SUSHI'], ['SXPUSDT'  , 'SXP'  ],
    ['TLMUSDT'  , 'TLM'  ], ['TRXUSDT'  , 'TRX'  ], ['XEMUSDT'  , 'XEM'  ], ['XRPUSDT'  , 'XRP'  ],
  ];
  .forEach(m => MARKETS[m[0]] = {name: m[0], shortname: m[1]});

  const s = ss.getSheetByName('History1');

  // get all data from 'History1'
  const data = s.getRange(1,1,s.getLastRow(),8).getDisplayValues();

  // get list of markets from column 2 (only unique values)
  const markets = s.getRange(2,2,s.getLastRow(),1).getValues()
  .flat().filter(String).filter((item,i,ar)=>ar.indexOf(item)==i);

  // fill all sheets with data
  markets.forEach(m => fill_sheet(MARKETS[m], data));
  
  // test:
  // console.log(markets[0]);               // show first market
  // fill_sheet(MARKETS[markets[0]], data); // fill first sheet

}

function fill_sheet(market, data) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // get from data only the rows of given market
  var data = data.filter(x => x[1] == market.name);

  // go to sheet and add the rows
  const s = ss.getSheetByName(market.shortname);
  const lastRow = s.getRange('A1:A').getValues().filter(String).length;
  s.getRange(lastRow+1,1,data.length,data[0].length).setValues(data);

}

之前

之后

【讨论】:

  • 兄弟,我检查了代码,也应用了与您在上面编写的相同的代码,但它不起作用。它不会将数据填充到工作表中。你能再检查一下缺少什么吗?您可以查看我共享的相同谷歌表格它对所有人开放。您可以对其进行实时测试。谢谢
  • 我还没有尝试过最简单的变体。在第二个变体中,你已经有了全局变量SS。我将变量 ss 设为局部变量。现在它起作用了。我刚刚测试过。
  • Khrishtich 谢谢兄弟,效果很好。
  • 不客气。我不寒而栗地想到手动复制和粘贴所有这些行会是什么样子。 :)
  • 我已经自动化了整个过程,但我遇到了错误以及一些行处理。您希望它在同一个线程上看到还是我需要打开新线程?
【解决方案2】:

您可以使用简单的公式,例如:

=FILTER(History1!A:H, History1!B:B="ETHUSDT")

因此,在您将日期粘贴到 History1 表后,所有这些都将在您的其他表中自动排序

【讨论】:

  • 但是兄弟,我每天都有新数据,我想保留以前的数据和新数据,这就是为什么我认为一个过滤数据的脚本然后将其复制并粘贴到下一个空行工作表会很好用。有这样的解决方案吗?
【解决方案3】:
function split_history(){
  
  var ss=SpreadsheetApp.getActive();
  var hissht=ss.getSheetByName("History1");
  var hisvals=hissht.getDataRange().getValues();
  var sheets=ss.getSheets();
  for (i=0;i<sheets.length;i++){
    if (sheets[i].getName()=="Summary" || sheets[i].getName()=="History1" || sheets[i].getName()=="Main Menu" ) {} else {
      var sn=sheets[i].getName();
      var vals=[];
      for (j=1;j<hisvals.length;j++){
        if (hisvals[j][8]==sn){
          vals.push([hisvals[j][0],hisvals[j][1],hisvals[j][2],hisvals[j][3],hisvals[j][4],hisvals[j][5],hisvals[j][6],hisvals[j][7]]) ; //modify it as per your need
        }
      }
      var dsht=ss.getSheetByName(sn);
      var dlr=dsht.getLastRow();
      dsht.getRange(dlr+1,1,vals.length,8).setValues(vals); //i have used only 4 columns A,B,C,D - you can modify it

    }
  }
}
//

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多