【问题标题】:Sheets Forms Data Manipulation and Deleting Rows if Certain Cells are Blank如果某些单元格为空白,表格表单数据操作和删除行
【发布时间】:2019-08-11 11:53:30
【问题描述】:

这个问题类似于“Google 表格中的表单数据操作”(https://webapps.stackexchange.com/questions/88736/forms-data-manipulation-in-google-sheets),但需要更多的自动化:

背景:用户为请求填写谷歌表单,并可以选择重复相同的问题来填写第二个、第三个、第四个和第五个请求。我创建了一个表格来处理这些行,以便将具有相同列的行转移到一列。

这是我的示例表: https://docs.google.com/spreadsheets/d/11DM7z_vwuR1S6lgMN7Wu7a0GoouVc2_5xj6nZ1Ozj5I/edit#gid=1967901028

表单回复:返回用户填写表单的回复

Manipulated Rows: 工作表,使用以下方法返回已操作的行: =OFFSET('表单响应'!$A$2,ceiling((row()-row($B$1))/5,1)-1,column()-column($B$1),1,COUNTA($ B$1:$D$1)) 在 B2 单元格中,

=OFFSET('Form Responses'!$A$2,ceiling((row()-row($B$1))/5,1)-1,mod(row()-(row($B$1) +1),5)*COUNTA($E$1:$N$1)+COUNTA($B$1:$D$1),1,COUNTA($E$1:$N$1)) 在 E2 单元格中

粘贴值:此工作表返回 Manipulated Rows 的粘贴值,不包括偏移公式,然后删除任何包含空白单元格 E-N 的行。以下是“粘贴值”选项卡中反映的应用脚本:

var ss = SpreadsheetApp.getActive();
var sheet = SpreadsheetApp.getActiveSheet();

//Duplicate sheet 'Manipulated Rows' as paste values
function moveValuesOnly() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Paste Values');
  var source = ss.getRange('Manipulated Rows!A1:T100000');
  source.copyTo(ss.getRange('Paste Values!A1'), {contentsOnly: true});
  deleteRows(sheet);
}

//Function to Delete empty rows:
function deleteRows(sheet) {
  var rows = sheet.getDataRange();
  var range_manipulated_rows = ss.getSheetByName('Manipulated Rows!A1:T100000');
  var range_paste_values = ss.getSheetByName('Paste Values!A1:T100000');
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (range_manipulated_rows == range_paste_values && row[4] == '' && row[5] == '' && row[6] == '' && row[7] == '' && row[8] == '' && row[9] == '' 
        && row[10] == '' && row[11] == '' && row[12] == '' && row[13] == '') { // if paste values tab is equal to manipulated rows tab and cell E-N are blank
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

我想通过创建一个应用程序脚本来使其更加自动化,该脚本将直接将“表单响应”表转换为“粘贴值”表,而不使用操作行。与“粘贴值”表中一样,它需要删除所有单元格 E-N 均为空白的行。

【问题讨论】:

  • 我可以问你关于你的问题吗? 1.您想直接将Form Responses的工作表转换为Paste Values的工作表,而不使用Manipulated Rows。我的理解正确吗? 2. 您的电子表格样本是最新的吗?如果您想更改问题,请首先更新它。我想参考最新的。
  • 嗨@Tanaike 是的,这是正确的。我已经更新了问题,我的示例电子表格是最新的。非常感谢!
  • 感谢您的回复。不幸的是,我无法理解附加问题。我为我糟糕的英语水平道歉。
  • 嗨@Tanaike,你说的是正确的;我想直接将表单响应表转换为粘贴值表而不使用操作行
  • 感谢您的回复。我还不能理解你的附加问题。可以问一下它的详细信息吗?我想在我能正确理解之后再考虑你的解决方案。

标签: google-apps-script google-sheets


【解决方案1】:
  • 您想使用 Google Apps 脚本直接将“表单响应”的值转换为“粘贴值”。
  • “地址”到“您还有其他打印机请求吗?”有 5 个周期。 “D”到“AZ”的列。数据可能是 1 个周期和 3 个周期。但最大 5 个周期是恒定的。

从您的问题和 cmets 中,我可以理解以上内容。这个示例脚本怎么样?

示例脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var src = ss.getSheetByName("Form Responses");
  var dst = ss.getSheetByName("Paste Values");
  var values = src.getDataRange().getValues();
  var header = values.splice(0, 1)[0].splice(0, 13);
  var res = values.reduce(function(ar, e) {
    var h = e.splice(0, 3);
    h.unshift("");
    for (var i = 0; i < 5; i++) {
      var temp = e.splice(0, 10);
      if (temp.filter(String).length == 0) continue;
      if (temp.length < 10) temp.splice(temp.length, 10 - temp.length, "");
      ar.push(h.concat(temp));
    }
    return ar;
  }, []);
  if (dst.getRange("A1").getValue() != "Status") res.unshift(["Status"].concat(header));
  dst.getRange(dst.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
}

注意:

  • 在此示例脚本中,使用了Form ResponsesPaste Values 的工作表名称。如果要更改工作表名称,请修改脚本。
  • 在这个示例脚本中,Paste Values 工作表的标题行是自动设置的。如果不想设置,请修改脚本。

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多