Google apps script 如果某些单元格为空,则图纸形成数据操作和删除行

Google apps script 如果某些单元格为空,则图纸形成数据操作和删除行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,这个问题类似于“Google Sheets中的表单数据操作”(),但需要更多的自动化: 背景:用户填写谷歌表单请求,并可以选择重复这些问题来填写第二、第三、第四和第五个请求。我已经创建了一个工作表,它将处理这些行,以便将具有相同列的行转移到一列 以下是我的示例表: 表单响应:返回填写表单的用户响应的表单 操纵行:使用以下命令返回操纵行的工作表: =单元格B2中的偏移量('Form Responses'!$A$2,上限((行()-行($B$1))/5,1)-1,列()-列($B$1),1,COU

这个问题类似于“Google Sheets中的表单数据操作”(),但需要更多的自动化:

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

以下是我的示例表:

表单响应:返回填写表单的用户响应的表单

操纵行:使用以下命令返回操纵行的工作表: =单元格B2中的偏移量('Form Responses'!$A$2,上限((行()-行($B$1))/5,1)-1,列()-列($B$1),1,COUNTA($B$1:$D$1))

=抵销('Form Responses'!$A$2,上限((行()-行($B$1))/5,1)-1,mod(行()-(行($B$1)+1),5)*COUNTA($E$1:$N$1)+COUNTA($B$1:$D$1),1,COUNTA($E$1:$N$1)) 在单元格E2中

粘贴值:此工作表返回操作行的粘贴值,不包括偏移公式,然后删除任何具有空白单元格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++;
    }
  }
};
var ss=SpreadsheetApp.getActive();
var sheet=SpreadsheetApp.getActiveSheet();
//将工作表“操纵行”复制为粘贴值
函数moveValuesOnly(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“粘贴值”);
var source=ss.getRange('操纵行!A1:T100000');
copyTo(ss.getRange('Paste Values!A1'),{contentsOnly:true});
删除行(张);
}
//用于删除空行的函数:
函数删除行(表){
var rows=sheet.getDataRange();
var range_oplized_rows=ss.getSheetByName('oplized rows!A1:T100000');
var range_paste_values=ss.getSheetByName('paste values!A1:T100000');
var numRows=rows.getNumRows();
var values=rows.getValues();
var rowsDeleted=0;
对于(var i=0;i
  • 您希望使用Google Apps脚本直接将“表单响应”的值转换为“粘贴值”
  • “D”到“AZ”列中的“地址”到“您是否有其他打印机请求?”有5个周期。数据可能是1个周期和3个周期。但最大5个周期是恒定的
从你的问题和评论中,我可以理解上面的内容。这个示例脚本怎么样

示例脚本:
函数myFunction(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var src=ss.getSheetByName(“表单响应”);
var dst=ss.getSheetByName(“粘贴值”);
var values=src.getDataRange().getValues();
var头=值。拼接(0,1)[0]。拼接(0,13);
var res=值。减少(函数(ar,e){
var h=e.拼接(0,3);
h、 取消移位(“”);
对于(变量i=0;i<5;i++){
变压温度=e.接头(0,10);
如果(临时过滤器(字符串).length==0)继续;
如果(温度长度<10)温度拼接(温度长度,10-温度长度,“”);
ar.push(h.concat(温度));
}
返回ar;
}, []);
if(dst.getRange(“A1”).getValue()!=“Status”)res.unshift([“Status”].concat(header));
getRange(dst.getLastRow()+1,1,res.length,res[0].length).setValues(res);
}
注:
  • 在此示例脚本中,使用了
    表单响应
    粘贴值
    的工作表名称。如果要更改工作表名称,请修改脚本
  • 在此示例脚本中,
    粘贴值的工作表的标题行是自动设置的。如果不想设置,请修改脚本
参考资料:
      • 您希望使用Google Apps脚本直接将“表单响应”的值转换为“粘贴值”
      • “D”到“AZ”列中的“地址”到“您是否有其他打印机请求?”有5个周期。数据可能是1个周期和3个周期。但最大5个周期是恒定的
      从你的问题和评论中,我可以理解上面的内容。这个示例脚本怎么样

      示例脚本:
      函数myFunction(){
      var ss=SpreadsheetApp.getActiveSpreadsheet();
      var src=ss.getSheetByName(“表单响应”);
      var dst=ss.getSheetByName(“粘贴值”);
      var values=src.getDataRange().getValues();
      var头=值。拼接(0,1)[0]。拼接(0,13);
      var res=值。减少(函数(ar,e){
      var h=e.拼接(0,3);
      h、 取消移位(“”);
      对于(变量i=0;i<5;i++){
      变压温度=e.接头(0,10);
      如果(临时过滤器(字符串).length==0)继续;
      如果(温度长度<10)温度拼接(温度长度,10-温度长度,“”);
      ar.push(h.concat(温度));
      }
      返回ar;
      }, []);
      if(dst.getRange(“A1”).getValue()!=“Status”)res.unshift([“Status”].concat(header));
      getRange(dst.getLastRow()+1,1,res.length,res[0].length).setValues(res);
      }
      
      注:
      • 在此示例脚本中,使用了
        表单响应
        粘贴值
        的工作表名称。如果要更改工作表名称,请修改脚本
      • 在此示例脚本中,
        粘贴值的工作表的标题行是自动设置的。如果不想设置,请修改脚本
      参考资料:

      我可以问一下您的问题吗?1.您想直接将
      表单回复
      转换为
      粘贴值
      表单,而不使用
      操纵行
      。我的理解正确吗?2.您的示例电子表格是最新的吗?如果您想更改问题,请首先更新它。我会我想引用最新的一个。你好@Tanaike是的,这是正确的。我已经更新了这个问题,我的电子表格样本是最新的。非常感谢!谢谢你的回复。不幸的是,我不能理解额外的问题。我为我糟糕的英语道歉
      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);
      }