运行循环时如何写入下一列?

时间:2019-05-22 06:04:58

标签: google-apps-script google-sheets google-apps-script-addon

我想从google驱动器中的文件夹中提取所有链接,并写两列,其中一列包含该链接,下一列包含我是google scripting新手的文件名,并编写了以下代码:

function myFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getActiveSheet();
  var c=s.getActiveCell();
  var fldr=DriveApp.getFolderById("0B37vVx5p-eGMTmJmTF9JOUwxZnc");
  var files=fldr.getFiles();
  var names=[],f,str;
  while (files.hasNext()) {
    f=files.next();
    str='=hyperlink("' + f.getUrl() + '")';
    names.push([str]);
  }
  s.getRange(c.getRow(),c.getColumn(),names.length).setFormulas(names);
}
function myFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getActiveSheet();
  var c=s.getActiveCell();
  var fldr=DriveApp.getFolderById("0B37vVx5p-eGMTmJmTF9JOUwxZnc");
  var files=fldr.getFiles();
  var names=[],f,str;
  while (files.hasNext()) {
    f=files.next();
    str='=" + f.getName() + "';
    names.push([str]);
  }
  s.getRange(c.getRow(),c.getColumn(),names.length).setFormulas(names);
}

问题在于,在第一列中写入链接后,它会用第一列中的名称覆盖它。如何指定第二段代码应写入哪一列?

3 个答案:

答案 0 :(得分:0)

使用Range.offset

  

返回一个新范围,该范围从该范围偏移给定的行数和列数(可以为负数)。新范围与原始范围相同。

答案 1 :(得分:0)

没有真正的理由将它们分别放在单独的函数中,您可以将它们都推到同一数组中,然后插入到工作表中,下面的代码应该可以满足您的期望:

function getFolders() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getActiveSheet();
  var c=s.getActiveCell();
  var fldr=DriveApp.getFolderById("0B37vVx5p-eGMTmJmTF9JOUwxZnc");
  var files=fldr.getFiles();
  var names=[],f,url,name;
  while (files.hasNext()) {
    f=files.next();
    url='=hyperlink("' + f.getUrl() + '")';
    name='="' + f.getName() + '"';
    names.push([url,name]);
  }
  s.getRange(c.getRow(),c.getColumn(),names.length, 2).setFormulas(names);
}

我不得不调整name='="' + f.getName() + '"';,因为引号不在正确的位置,它是将字符串本身推入数组而不是文件名。

像这样将两个值都推入数组意味着您不需要偏移范围,因为使用setValues()时数组将跨越2列,因此为什么我必须为{{1 }}中的numColumns

答案 2 :(得分:0)

在Google Apps脚本项目中,每个函数应具有唯一的名称,否则,将仅按执行时加载的顺序执行最后一个函数。因此,首先,永远不会编写超链接公式。

另一方面,如a previous answer所述,无需在每列上编写单独的函数,一个函数可以同时填充两列。

在此代码行上:

names.push([str]);

自变量por push是具有单个值的数组。用包含两个列的值的数组替换此参数。要对您的第一个功能进行最少的更改,请重命名str变量,为第二列添加第二行代码,并使用正确且唯一的变量名称,即(如上一个答案所示):

url='=hyperlink("' + f.getUrl() + '")';
name='=" + f.getName() + "';
names.push([url,name]);

最后,在最后一条语句中添加列数

s.getRange(c.getRow(),c.getColumn(),names.length, 2).setFormulas(names);

别忘了删除名为myFunction的第二个函数