For loop Google Sheets范围上的For循环无法更改文件所有者

For loop Google Sheets范围上的For循环无法更改文件所有者,for-loop,google-apps-script,For Loop,Google Apps Script,我需要将我拥有的数千个文件的所有权转移给具有编辑权限的其他人,但我了解到Google Drive要求您一次只处理一个文件。凭借中级但不断增长的JS经验,我决定编写一个脚本,从电子表格中的文件ID列表中更改所有者,但是我遇到了麻烦,我不知道为什么。调试器只是在脚本中运行,我觉得一切都很正常。我非常感谢您的帮助 function changeOwner() { var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadshe

我需要将我拥有的数千个文件的所有权转移给具有编辑权限的其他人,但我了解到Google Drive要求您一次只处理一个文件。凭借中级但不断增长的JS经验,我决定编写一个脚本,从电子表格中的文件ID列表中更改所有者,但是我遇到了麻烦,我不知道为什么。调试器只是在脚本中运行,我觉得一切都很正常。我非常感谢您的帮助

function changeOwner() {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/').getSheetByName('Sheet1');
  var range = ss.getRange(1,1,2211);
  for (i = 0; i < range.length; i++){
    var file = range[i][0].getValue();
    var fileid = DriveApp.getFileById(file);
    fileid.setOwner('******@gmail.com');
  }
}
函数changeOwner(){
var ss=SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/getSheetByName('Sheet1');
变量范围=ss.getRange(1,12211);
对于(i=0;i
您的问题是
范围
类没有
长度
属性。相反,对范围执行
getValues()
调用以有效地创建JavaScript数组,并对其进行迭代:

function changeOwner() {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/').getSheetByName('Sheet1');
  var values = ss.getRange(1, 1, 2211).getValues();
  for (i = 0; i < values.length; ++i){
    var fileid = value[i][0];
    var file = DriveApp.getFileById(fileid);
    file.setOwner('******@gmail.com');
  }
}
函数changeOwner(){
var ss=SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/getSheetByName('Sheet1');
var values=ss.getRange(1,12211).getValues();
对于(i=0;i
您还可以进行其他改进,例如:

  • 动态范围读取(而不是2211行数据的固定假设)
  • 写入第二个数组以跟踪尚未处理的文件
  • 检查文件是否存在
  • 检查文件是否确实为您所有
  • 检查剩余执行时间,以允许序列化您所做的任何更新/跟踪,从而防止下一次执行重复您刚才所做的操作

等等。我将让您研究这些主题,以及
DriveApp
SpreadsheetApp
Sheet
Range
类的应用程序脚本文档中提供的方法。请注意,您还可以使用Javascript 1.6的所有功能,因此您在Javascript开发人员参考资料(如)中找到的许多内容也可以使用。

您的问题是
范围
类没有
长度
属性。相反,对范围执行
getValues()
调用以有效地创建JavaScript数组,并对其进行迭代:

function changeOwner() {
  var ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/').getSheetByName('Sheet1');
  var values = ss.getRange(1, 1, 2211).getValues();
  for (i = 0; i < values.length; ++i){
    var fileid = value[i][0];
    var file = DriveApp.getFileById(fileid);
    file.setOwner('******@gmail.com');
  }
}
函数changeOwner(){
var ss=SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/********/getSheetByName('Sheet1');
var values=ss.getRange(1,12211).getValues();
对于(i=0;i
您还可以进行其他改进,例如:

  • 动态范围读取(而不是2211行数据的固定假设)
  • 写入第二个数组以跟踪尚未处理的文件
  • 检查文件是否存在
  • 检查文件是否确实为您所有
  • 检查剩余执行时间,以允许序列化您所做的任何更新/跟踪,从而防止下一次执行重复您刚才所做的操作

等等。我将让您研究这些主题,以及
DriveApp
SpreadsheetApp
Sheet
Range
类的应用程序脚本文档中提供的方法。请注意,您还可以使用Javascript 1.6的所有功能,因此在Javascript开发人员参考资料(如)中找到的许多内容也可供您使用。

下面测试的代码可以很好地使用IDs

function myFunction() {
  var spreadsheet = SpreadsheetApp.openById('ID');
var range = spreadsheet.getDataRange().getValues();
for (i = 0; i < range.length; i++){
    var file = range[i][0].toString();
    var fileid = DriveApp.getFileById(file);
    fileid.setOwner('***@gmail.com');
}
}
函数myFunction(){
var电子表格=SpreadsheetApp.openById('ID');
变量范围=电子表格.getDataRange().getValues();
对于(i=0;i
测试如下代码与IDs配合良好

function myFunction() {
  var spreadsheet = SpreadsheetApp.openById('ID');
var range = spreadsheet.getDataRange().getValues();
for (i = 0; i < range.length; i++){
    var file = range[i][0].toString();
    var fileid = DriveApp.getFileById(file);
    fileid.setOwner('***@gmail.com');
}
}
函数myFunction(){
var电子表格=SpreadsheetApp.openById('ID');
变量范围=电子表格.getDataRange().getValues();
对于(i=0;i
您是否尝试先为单个记录运行此代码?它有效吗?是的,当我为fileid变量分配一个文件ID时,它有效。好的,请尝试在Google工作表中添加此ID,并在单个记录上执行此操作。我已删除循环,并为file和fileid变量分配了一个文件ID,两者都有效,看来我的循环是个问题。可能是重复的。您是否尝试先为一条记录运行此代码?它工作吗?是的,当我为fileid变量分配一个文件ID时,它工作。好的,请尝试在Google工作表中添加此ID,并在单个记录上执行此操作。我已删除循环,并为file和fileid变量分配了一个文件ID,并且两者都工作,因此看起来我的循环是问题所在。可能存在重复的