如何读取指定的单元格值并将文件从 excel 转换为电子表格?

Posted

技术标签:

【中文标题】如何读取指定的单元格值并将文件从 excel 转换为电子表格?【英文标题】:How can i read a specified value of cell and convert a file from excel into spreadsheet? 【发布时间】:2022-01-23 03:56:18 【问题描述】:

在这里,我试图检查 "STATUS" 列是否为“新文件”,然后我想执行从 excel 到电子表格的文件对话。

对于 “STATUS” 列,我创建了一个 IF-ELSE 语句,

if (row[0] === "last week file") 
  newValues.push(['OLD FILE'])

else
  newValues.push(['NEW FILE'])
  ConvertFiles()
  return

因此,我通过“STATUS”进行检查,如果状态栏为空则写为'NEW FILE',然后将文件从excel转换为电子表格,因为我已经调用了其中的方法。

这里是文件转换的EDITED版本代码:

function ConvertFiles() 
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var range = sheet.getRange(2, 1, sheet.getLastRow()-1, 5); // get A2:E6 range
  var data = range.getValues(); // get A2:E6 data

for(var i = 0; i < data.length; i++) 
  if(data[i][2] == " ")

  for( var r= 2;r < sheet.getLastRow()+1; r++)
  var fileId = sheet.getRange(r,1).getValue(); 
  var folderID = sheet.getRange(r,2).getValue(); //for destination folder

  var files = DriveApp.getFileById(fileId);
  var name = files.getName().split('.')[0]; 
  var blob = files.getBlob();
  
  var newFile = 
  title: name.replace('_converted','') + '_converted', 
  parents: [id: folderID] ; 

  var destinationFolderId = DriveApp.getFolderById(folderID); 
  var existingFiles = destinationFolderId.getFilesByName(newFile.title);

while(existingFiles.hasNext()) 
  var oldConvertedFileWithSameNameID = existingFiles.next().getId();
  Drive.Files.remove(oldConvertedFileWithSameNameID,supportsAllDrives: true);
 

  var newFileID = Drive.Files.insert(newFile, blob,  convert: true,supportsAllDrives: true ).id; 
  Logger.log(newFileID);

  var Url = "https://drive.google.com/open?id=" + newFileID;
   //sheet.getRange(r,4).setValue(newFileID);
   //sheet.getRange(r,5).setValue(Url); 
   
   sheet.getRange(i+2,4).setValue(newFileID); //set value in column D
   sheet.getRange(i+2,5).setValue(Url); //set value in column E  

 
 

我面临的 错误 是,当我在 if 语句中调用方法 ConvertFiles() 时,转换从 第 2 行一直持续到第 6 行,而不会停止示例中以红色圆圈显示。

我只想在 "NEW FILES" 上进行转换,该文件将位于第 5 行和第 6 行。

如何在选定/指定的行上进行转换?

【问题讨论】:

读取单元格的值很简单。 Sheet.getRange().getValue() 转换excel文件:***.com/a/55645062/7215091 【参考方案1】:

如果您获得工作表中的所有值,循环 getValues() 方法将返回的二维数组并添加一个仅处理新文件的 if 语句,效率会更高。

示例:

在下面的示例中,我创建了一个脚本,该脚本将只处理状态列具有空白值的行。

代码:

function ConvertFiles() 
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var range = sheet.getRange(2, 1, sheet.getLastRow()-1, 5); // get A2:E6 range
  var data = range.getValues(); // get A2:E6 data
  
  /*the content of data is 2D array, 
  each sub array represent rows in your table*/
  for(var i = 0; i < data.length; i++) 
    if(data[i][2] == "") //the 2 in [i][2] represent the value of C column in sheet
      
      //Add your file conversion code here

       sheet.getRange(i+2,4).setValue("Test only"); //set value in column D
       sheet.getRange(i+2,5).setValue("Test only"); //set value in column E
    
  

数据:

输出:

参考资料:

Sheet.getRange(row, column, numRows, numColumns) Range.getValues() Range.setValue(value)

编辑:

下面代码中data 变量的值是一个二维数组,包含所提供范围内的所有数据。在您的示例中,它是 A2:E6 的数据。

示例输出:

[
 [fileId1,folderId1,Status1,,],
 [fileId2,folderId2,Status2,,],
 [fileId3,folderId3,Status3,,],
 [fileId4,folderId4,,,],
 [fileId5,folderId5,,,],
]

for 循环将在每次迭代中访问每个子数组,由于我们已经知道目标数据(fileID 和 folderID)的位置,我们不需要创建另一个 for 循环来访问它,我们只需指定索引数据所在的位置。 data[i][0] 用于文件 ID,data[i][1] 用于文件夹 ID。添加if(data[i][2] == ""),检查每行C列是否为空,忽略有数据的。

代码:

function ConvertFiles() 
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var range = sheet.getRange(2, 1, sheet.getLastRow()-1, 5);
  var data = range.getValues();
  for(var i = 0; i < data.length; i++)
    if(data[i][2] == "")
      var fileId = data[i][0]; 
      var folderID = data[i][1];
      var files = DriveApp.getFileById(fileId);
      var name = files.getName().split('.')[0]; 
      var blob = files.getBlob();
      var newFile = 
      title: name.replace('_converted','') + '_converted', 
      parents: [id: folderID] ;
      var destinationFolderId = DriveApp.getFolderById(folderID); 
      var existingFiles = destinationFolderId.getFilesByName(newFile.title); 
      while(existingFiles.hasNext()) 
        var oldConvertedFileWithSameNameID = existingFiles.next().getId();
        Drive.Files.remove(oldConvertedFileWithSameNameID,supportsAllDrives: true);
      
      var newFileID = Drive.Files.insert(newFile, blob,  convert: true,supportsAllDrives: true ).id; 
      var Url = "https://drive.google.com/open?id=" + newFileID;
      sheet.getRange(i+2,4).setValue(newFileID); 
      sheet.getRange(i+2,5).setValue(Url); 
    
  

【讨论】:

感谢您的回复。正如我在问题部分中再次分享的那样,我确实在我的代码中实现了您的代码。我保留for( var r= 2;r &lt; sheet.getLastRow()+1; r++),因为我想我以后需要用它来读取目的地的文件ID和文件夹ID。我尝试通过调用 if else 语句中的方法来运行代码,但什么也没发生。但是,我尝试仅运行 ConvertFiles() 方法,但在工作表内仍然没有执行任何操作(没有发生转换) 我正在尝试按顺序制作,当有上传新文件时 >> if-else语句将检测并填充空单元格value with "NEW FILE" >> 填完值后,会对新上传的新文件进行文件转换(我是通过调用convert file方法完成的在 if-else 语句中)。 @VishnuKumaran - 只需使用data[i][0]data[i][1] 即可获取文件ID 和文件夹ID。我添加了另一个代码 sn-p 并将转换过程包含在您的代码中。让我知道它是否有效。 我还希望您打印data 变量的值并在how to read and write on 2D array 上查看本教程。

以上是关于如何读取指定的单元格值并将文件从 excel 转换为电子表格?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)

POI - 如何将单元格值设置为日期并应用默认Excel日期格式?

nodejs读取excel时如何判断合并的单元格

java导出excel,单元格的格式为下拉框。打开excel时,提示发现不可读取内容和已修复了公式和单元格值

读取 Excel 单元格值而不是计算它的公式 -openpyxl