Как записать в следующий столбец при запуске цикла? - PullRequest
0 голосов
/ 22 мая 2019

Я хотел бы извлечь все ссылки из папки на диске Google и написать два столбца, один из которых содержит ссылку, а следующий столбец - имя файла.

Я новичок в скриптах Google и написал этот код:

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 ]

1 голос
/ 22 мая 2019

Нет реальной причины захватывать их в отдельных функциях, вы можете просто поместить их в один и тот же массив и вставить в лист, код ниже должен сделать то, что вы ожидаете:

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() + '"';, потому что кавычки были не совсем в нужном месте, он выдвигал эту строку в массив, а не в имя файла.

Выдвигать оба значения в массив, как это означаетвам не нужно смещать диапазон, потому что массив будет охватывать 2 столбца при использовании setValues(), поэтому я должен был добавить 2 для numColumns в setValues().

0 голосов
/ 16 июня 2019

В проекте Google Apps Script каждая функция должна иметь уникальные имена, иначе будет выполняться только последняя функция в том порядке, в котором они были загружены во время выполнения.Итак, во-первых, формулы гиперссылок никогда не пишутся.

С другой стороны, как упоминалось в в предыдущем ответе , нет необходимости иметь отдельные функции для записив каждом столбце одна функция может заполнить оба столбца одновременно.

В этой строке кода:

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

0 голосов
/ 22 мая 2019

Использовать Range.offset:

Возвращает новый диапазон, который смещен из этого диапазона на указанное количество строк и столбцов (которое может быть отрицательным).Новый диапазон такого же размера, как и оригинальный диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...