Попытка поместить переменную в строку, чтобы функция импортировала ключ, а затем выполнялась на листе.

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

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

Мне нужен способ вставить ключ переменной в эту строку так, чтобы он по-прежнему выполнялся на листе, ИЛИ выводить идентификатор, который хранится в переменной, а затем автоматически помещать его в эту строку. Большое спасибо заранее!

var counter = 0;

var files = [];
var key = (" ");

function searchFolder() {
 var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder
 // Log the name of every file in the folder.
 var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder
 while (filesN.hasNext()) files.push(filesN.next().getName());
 while (filesN.hasNext()) 
keyID.push(filesN.next().getId());


}

function autoUpdate(){ //updates monthly from newly imported daily
 if (counter == 1){ //counter is made to be 1 when day is uploaded to monthly
var ss =     SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc");     //defines target spreadsheet ie monthly
 SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active
var range= ss.getRange("A1:A1"); //sets range in target. ONLY CHOOSE ONE   
range.activate;  // activates range
//HELP HERE PLEASE
range.setValue('=IMPORTRANGE("1hVv6ldHEaCCI_uptr0MpzAyP60x7on8YR_brWwWXTWo","sheet1!A1:167")'); //Puts in IMPORTRANGE into target as a STRING value (just words). Once it hits the sheet, then SHEETS executes IMPORTRANGE not SCRIPTS. In Source sheet, range is selected to import to target (ie A1:G6)
counter=(counter-1)
  }
 }

 function timeStamp(){
  if (files == "Daily") {
  counter= (counter+1)
  }
}

searchFolder();
timeStamp();
autoUpdate();

1 ответ

Решение

Вы нажали на #REF? Потому что обычно с функцией IMPORTRANGE вы должны "Разрешить доступ", чтобы он извлекал данные. Пока вы не сделаете это, он будет отображать #REF. Если вы нажмете на ячейку, появится всплывающее окно с кнопкой "Разрешить доступ".

Как только я сделал это на моем тесте вашей оригинальной команды, range.setValue('=IMPORTRANGE("1hVv6ldHEaCCI_uptr0MpzAyP60x7on8YR_brWwWXTWo","sheet1!A1:167")') работал.

Также, чтобы использовать переменную, ваша команда будет выглядеть следующим образом...range.setValue(('=IMPORTRANGE("'+key+'","sheet1!A1:167")'))

Обновление на основе комментариев

+ Изменить

  var files = [];
  var key = ("");
  var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder
     // Log the name of every file in the folder.
     var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder
     while (filesN.hasNext()) files.push(filesN.next().getName());
     while (filesN.hasNext()) 
    keyID.push(filesN.next().getId());

Для того, чтобы...

  var files = [];
  var key = [];
  var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder
  // Log the name of every file in the folder.
  var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder
  while (filesN.hasNext()) {
    var file = filesN.next();
    key.push(file.getId())
    files.push(file.getName());
  }
  Logger.log(key)

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

ОБНОВЛЕНИЕ 8-14-2016

Это то, что я имел в виду, когда просматривал массив ключей. Я проверил, и это работает.

    function test() {
  var files = [];
  var keys = [];
  var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder
  // Log the name of every file in the folder.
  var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder
  while (filesN.hasNext()) {
    var file = filesN.next();
    keys.push(file.getId())
    files.push(file.getName());
  }
  Logger.log(keys)

    var ss = SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc");     //defines target spreadsheet ie monthly
    SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active
    var s = ss.getSheetByName('Sheet1');
    for (var i = 0; i < keys.length; i++) { 
      var range = s.getRange(1,i+1); //sets range in target. ONLY CHOOSE ONE
      range.setValue('=IMPORTRANGE("'+keys[i]+'","sheet1!A1:167")')
    }
  autoUpdate(keys);
}
Другие вопросы по тегам