如何读取指定的单元格值并将文件从 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 < 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 转换为电子表格?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)
POI - 如何将单元格值设置为日期并应用默认Excel日期格式?