【问题标题】:How Dynamically Transfer data in All Google Sheets based on Filter Data automatically如何根据自动过滤数据动态传输所有 Google 表格中的数据
【发布时间】:2023-03-05 14:45:01
【问题描述】:

我正在使用 Google 表格来记录我的库存。我正在尝试使一切自动化。有多个带有股票名称的工作表。我有一个工作表标题“History1”,我在其中手动输入数据,并构建以下代码来分离各个工作表中的所有数据。这是Sheet的链接Trade Binance Google Sheet Tracker

我编写了以下脚本,但它给了我错误并且无法正常工作。

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

    }
  }
}
//

它给了我following 错误代码。

请检查并建议我哪里做错了。谢谢

【问题讨论】:

  • 当您说it does not work correctly 时,您到底是什么意思?它会填充一些工作表然后出错,还是根本不填充任何工作表?我认为这可能是由于没有交易可以输入工作表的情况,在这种情况下,dsht.getRange(dlr+1,1,vals.length,8).setValues(vals) 之前的 if (vals.length === 0) continue 行可能会修复它。
  • @RafaGuillermo 谢谢,我的代码已经在工作并且我修复了它,但现在我面临的问题是,数据填充在最后一个空白行,因为列 J:N 包含公式和代码将 A2:H 中的行视为数据行。所以,我想要这样,代码应该在下一个 emply 单元格上填充数据,以便它获取 Column A2 单元格并填充第一个值,然后填充 B2:H2 并填充所有列。由于 J:N 单元格中的公式,现在它应该移动到下一个空白列而不是下一个空白行。我希望你明白我的意思。
  • 我认为最好提出一个新问题来引起更多关注。此外,如果您解决了问题,请考虑发布您的解决方法作为答案,以便未来遇到类似问题的用户也能找到解决方案:)

标签: google-apps-script google-sheets google-sheets-formula google-sheets-api


【解决方案1】:

试试这个:

function split_history() {
  const ss = SpreadsheetApp.getActive();
  const hsh = ss.getSheetByName("History1");
  const hvs = hsh.getRange(2,1,hsh.getLastRow() -1,9).getValues();
  const shts = ss.getSheets();
  const excl  = ["Summary","History1","Main Menu"];
  shts.forEach(s => {
    let oA = [];
    if(!~excl.indexOf(s.getName())) {
      hvs.forEach(r => {
        if(s.getName() == r[0]) {
          oA.push(r.slice(0,8));
        }
      });
      s.getRange(getColumnHeight(1,s,ss) + 1,1,oA.length,oA[0].length).setValues(oA);
    }
  });
}

如果您也将在您的写作的每个工作表中放置一个标题行并将其锁定。这在查看数据时会很有帮助,并且可以防止您出现该错误,因为工作表中总是至少有一行。

function getColumnHeight(col, sh, ss) {
  var ss = ss || SpreadsheetApp.getActive();
  var sh = sh || ss.getActiveSheet();
  var col = col || sh.getActiveCell().getColumn();
  var rcA = [];
  if (sh.getLastRow()){ rcA = sh.getRange(1, col, sh.getLastRow(), 1).getValues().flat().reverse(); }
  let s = 0;
  for (let i = 0; i < rcA.length; i++) {
    if (rcA[i].toString().length == 0) {
      s++;
    } else {
      break;
    }
  }
  return rcA.length - s;
}

【讨论】:

  • 上午 10:20:48 注意执行开始时间上午 10:20:49 错误 ReferenceError: sh is not defined split_history1 @ Split_History_Final.gs:28
  • 再试一次,我习惯了一直使用相同的变量,并使用了我对工作表的常用术语。
  • 我的代码运行良好,但它没有将结果从 A 列填充到 H 列的下一个空单元格,但它正在填充结果,其中该行完全为空白。如果您在那里看到工作表,您将看到第 3 行以及从 J 到 R 列包含一些公式。因此,代码正在填充结果,其中一行没有公式,位于公式行的下方。你能修好那个吗?
  • 哦,所以您在同一行的页面上还有其他数据。但是您使用 getLastRow() 来获取下一行的位置。效果如何?
  • 我认为getColumnHeight() 函数可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2018-05-08
相关资源
最近更新 更多