忽略其中包含公式的空单元格值

Posted

技术标签:

【中文标题】忽略其中包含公式的空单元格值【英文标题】:Ignore empty cell values which have formula in it 【发布时间】:2019-07-15 19:25:45 【问题描述】:

您好,我正在使用 JDBC 连接器将一些数据从 google sheet 插入到 mysql

谁能帮助我如何?

我只是用简单的 ='Sheet1'!C1 公式从另一个表中获取我的导入数据表中的数据

我试过了

var newdata = [i for each (i in data)if (isNaN(i))];

var newdata = data.filter(String);

但无法解决问题(可能是连接(',')过滤后导致问题)

以下日志详细信息供您参考 - 感谢您提供的任何帮助或指导。如果您需要更多详细信息,请告诉我

[19-07-15 09:22:29:522 PDT] INSERT INTO CymaxVendorReachout2(UTID,Process,BatchNo,BatchName,ReceivedDate,SKUCount,Status,VMTTicket,AssignedTo,Comments,querytype,EmailSentDate,FolUpNum,Folupfrom,FolUpDate,NextFolUpDate,Note) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
[19-07-15 09:22:29:525 PDT] [MER-8903-2019-07-29, Full Merch, MER-8903, Darlee - 903, 2019-07-24, 158, Invalid, No, Onkar, , , 2019-07-29, 1, Vendor, 2019-07-31, 2019-08-02, ]
[19-07-15 09:22:29:530 PDT] [MER-8904-2019-07-30, Full Merch, MER-8904, Darlee - 904, 2019-07-25, 159, Invalid, No, Onkar, , , 2019-07-30, 1, Vendor, 2019-08-01, 2019-08-05, ]
[19-07-15 09:22:29:536 PDT] [MER-8905-2019-07-31, Full Merch, MER-8905, Darlee - 905, 2019-07-26, 160, Invalid, No, Onkar, , , 2019-07-31, 1, Vendor, 2019-08-02, 2019-08-05, ]
[19-07-15 09:22:30:038 PDT] [, , , , , , , , , , , , , , , , ]
[19-07-15 09:22:30:044 PDT] [, , , , , , , , , , , , , , , , ]
[19-07-15 09:22:30:050 PDT] [, , , , , , , , , , , , , , , , ]
[19-07-15 09:22:30:055 PDT] [, , , , , , , , , , , , , , , , ]
[19-07-15 09:22:55:536 PDT] Data truncation: Incorrect date value: '' for column 'ReceivedDate' at row 1

我正在运行的完整谷歌应用脚​​本

function writeToTable() 
  var ss = SpreadsheetApp.getActive();
  var sheetDetails = ss.getSheetByName('Details');
  var sheetData = ss.getSheetByName('Data');
  var sheetImportData = ss.getSheetByName('Import Data');

  var host = sheetDetails.getRange("B1").getValue();
  var databaseName = sheetDetails.getRange("B2").getValue();
  var userName = sheetDetails.getRange("B3").getValue();
  var password = sheetDetails.getRange("B4").getValue();
  var port = sheetDetails.getRange("B5").getValue();
  var tableName = sheetDetails.getRange("B6").getValue();

  var url = 'jdbc:mysql://'+host+':'+port+'/'+databaseName;

  Logger.log(url);
  var sql = 'SELECT * FROM ' + tableName;

  var data = getData()
  var headerString = data[1]
  data = data[0]
  try
    var start = new Date();
    var conn = Jdbc.getConnection(url, userName, password);
    conn.setAutoCommit(false);

    var sql = 'INSERT INTO ' + tableName + headerString;
    Logger.log(sql);
    var stmt = conn.prepareStatement(sql);


    var dateColumns = []; // Add the index to this array for date type column
    for (var r in data) 
      Logger.log(data[r]);
      for (var c in data[r])
        if (dateColumns.indexOf(parseInt(c) + 1) >= 0) 
          var date = Utilities.formatDate(data[r][c], Session.getScriptTimeZone(),  "yyyy-MM-dd HH:mm:ss");
          stmt.setObject(parseInt(c) + 1, date)
        else
          stmt.setString(parseInt(c) + 1, data[r][c]);
        
      
      stmt.addBatch();
    

    var batch = stmt.executeBatch();
    conn.commit();
    conn.close();

    var end = new Date();
    Logger.log('Time elapsed: %sms for %s rows.', end - start, batch.length);
    SpreadsheetApp.getActive().toast('Time elapsed: %sms for %s rows.', end - start, batch.length);
  catch(err)
    SpreadsheetApp.getActive().toast(err.message);
    Logger.log(err.message);
   

function getData()
  //(UTID, Process, BatchNo, BatchName, ReceivedDate, SKUCount, Status, VMTTicket, AssignedTo, Comments, querytype, EmailSentDate, FolUpNum, Folupfrom, FolUpDate, NextFolUpDate, Note ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
  var ss = SpreadsheetApp.getActive();
  var sheetImportData = ss.getSheetByName('Import Data');
  var data = sheetImportData.getDataRange().getValues();
  var header = data[0];
  var headerString = header.join(',')

  headerString = '(' + headerString + ') values ('

  var questions = Array(header.length + 1).join('?').split('')

  headerString = headerString + questions.join(',') + ')'
  Logger.log(headerString)
  Logger.log(data.slice(1))
  return [data.slice(1), headerString]

【问题讨论】:

请问newdata的变量和你的脚本的关系? 道歉 我上传的 .gs 代码不完整。我已经更新了。我尝试使用***.com/questions/44579300/… 中给出的解决方案 我添加了 var newdata = data.filter(String);下面 var data = sheetImportData.getDataRange().getValues();并在脚本中用 newdata 替换数据变量,但它不起作用 感谢您回复和更新您的问题。对于Import Data 工作表的数据范围,您希望通过删除空值单元格而单元格具有公式来检索值。在这种情况下,当使用getValues() 时,仅检索值。所以我认为你的方法是合适的。但在你的问题中,它似乎不起作用。所以为了正确理解你的情况,你能提供一个样本电子表格吗?当然,请删除您的个人信息。 感谢您的回复。我可以看到您的示例电子表格。您要修改getData() 的脚本。如果我的理解是正确的,您能否提供您想要的示例输出值?通过这个,我想修改getData() 【参考方案1】: 对于导入数据表的数据范围,您希望通过删除所有单元格的值都为空而单元格有公式的行来检索值。

根据您的问题和回复,我可以理解为上述内容。为了实现这一点,请修改getData()的脚本如下。

修改脚本:

请在getData()函数的var data = sheetImportData.getDataRange().getValues();下面添加以下脚本。

var newData = data.filter(function(row) return row.filter(String).length > 0);

data = data.filter(function(row) return row.filter(String).length > 0);

参考:

filter()

【讨论】:

【参考方案2】:

编辑 2: 田池的回答比较简洁:

https://***.com/a/57048404/8240995

我的做法是从数组中查找和删除元素,这可能对不同的项目有用。

Google Apps 脚本部分

如果您只想获取单元格的可见值,即您在打开电子表格时看到的值,则可以替换

.getValue()

.getDisplayValue()

对于具有空白结果的公式的单元格,.getDisplayValue() 将返回一个空字符串。 它还包含电子表格中应用的任何格式,例如日期和时间格式。

编辑 - 新信息

我将编辑您的脚本以忽略 getData() 函数中的空白单元格显示值:

     function getData()
          //(UTID, Process, BatchNo, BatchName, ReceivedDate, SKUCount, Status, VMTTicket, AssignedTo, Comments, querytype, EmailSentDate, FolUpNum, Folupfrom, FolUpDate, NextFolUpDate, Note ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
          var ss = SpreadsheetApp.getActive();
          var sheetImportData = ss.getSheetByName('Import Data');
          // replacing this to fetch the display values var data = sheetImportData.getDataRange().getValues();
          var data = sheetImportData.getDataRange().getDisplayValues();
          var header = data[0];
          var headerString = header.join(',')

          headerString = '(' + headerString + ') values ('

          var questions = Array(header.length + 1).join('?').split('')

          headerString = headerString + questions.join(',') + ')'
          Logger.log(headerString)
    // now the header's sorted, we can trim the data to exclude any blank entries
          var newData = data.slice(1);
    for (var i = 0; i < newData.length; i++)
    if (newData[i] === '')
      newData.splice([i], 1);
      i = i - 1;// set the counter back one to catch consecutive blanks
    
    
          Logger.log(newData)
          return [newData, headerString]
        

从代码来看,所有数据似乎都在一行中。

我没有检查与标题行的关系。如果您有旨在排列数据的列标题,那么我的代码将有问题。 但是由于您想删除所有空白,我假设没有任何这样的列关联。

【讨论】:

嗨弗林感谢您的帮助,我已经更新了丢失的代码 我添加了 var newdata = data.filter(String);下面 var data = sheetImportData.getDataRange().getValues();并在脚本中用 newdata 替换数据变量,但它不起作用 另外,如果我将 var data = sheetImportData.getDataRange().getValue(); 更改为 var data = sheetImportData.getDataRange().getDisplayValue(); 我得到 TypeError: Cannot find function join in object U.(第 65 行,文件“writeToTabel”)

以上是关于忽略其中包含公式的空单元格值的主要内容,如果未能解决你的问题,请参考以下文章

如何基于单个单元格值格式化整个列?

如何在excel 中运算公式中引用单元格值

每次活动单元格更改行时更新单元格值

如何使用apache poi从公式单元格中读取单元格值

根据单元格的变化清除所有下一行的单元格值并保留公式

根据单元格值合并范围内的单元格,但最后一个单元格没有被合并