【问题标题】:How can i read a specified value of cell and convert a file from excel into spreadsheet?如何读取指定的单元格值并将文件从 excel 转换为电子表格?
【发布时间】: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 行。

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

【问题讨论】:

标签: excel google-apps-script google-sheets google-drive-api


【解决方案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
    }
  }
}

数据:

输出:

参考资料:


编辑:

下面代码中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 上查看本教程。
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多