Есть ли способ увидеть все таблицы Google, которые связаны/зависят от другой таблицы?

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

У меня есть довольно большой лист Google, который более или менее действует как БД. Он загружает данные из GForms, а затем эти данные используются на ряде других листов для различных целей (например, для отчетов, выборочного обмена информацией с определенными группами и т. д.), в основном через querys и importranges.

Редактирование основного листа разрешено только нескольким людям, включая меня. Один из других внес некоторые изменения (удалив некоторые столбцы), которые сломают любые запросы или импорт, потому что importrange не будет улавливать изменения столбцов и автоматически обновлять диапазон.

Внесенные изменения на самом деле хороши и их стоит сохранить, поэтому я не хочу их отменять.

Есть ли способ легко найти все листы, которые используют основной, чтобы я мог обновить затронутые формулы? При обновлении мне также нужно найти способ избежать повторения этого (я думаю, что могу сделать это, установив ссылки на диапазон с помощью address? Но это проблема будущего меня...)

Заранее спасибо!


person jgrouleau    schedule 30.01.2020    source источник


Ответы (2)


Поиск (Ctrl-H) дает возможность «Также искать в формулах».

Вы можете использовать это для поиска ссылок на конкретный лист, например, для поиска «лист1!» найдет все ячейки, которые ссылаются на лист1

Обратите внимание, что это может не работать, если определены именованные диапазоны, вам также может потребоваться выполнить поиск именованного диапазона.

person Alex Taylor    schedule 19.02.2020

Чтобы найти зависимости между листами в разных документах (или даже в одном и том же документе), используйте следующий скрипт для поиска ссылок на заданный идентификатор документа (например, в пределах IMPORTRANGE), например:

FindFormulae("1XgTuET_dJKP-i4JppvQQFI047-ZKP-i4o4bhE-K1lF-o")


function FindFormulae(keyword) {
// searches all google docs for formulae containing the given keyword
// outputs to sheet "output"
// may take a while if you have a lot of docs, and could timeout (5 minutes)
// if timeout just run the script again, it skips any docs already checked
// to cancel script execution go to https://script.google.com/home/executions
// Feb 2020 www.enex.net 

var sheetOut= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output");

docsAlreadyChecked = sheetOut.getRange(1,1,sheetOut.getLastRow(),1).getValues();

var files = DriveApp.getFiles();
while (files.hasNext()) {  // loop thru files
  var file = files.next();
  if (file.getMimeType() != "application/vnd.google-apps.spreadsheet") continue;  // only process spreadsheets
  docURL =file.getUrl();
  docName =file.getName();
  //Logger.log('Starting.. ' + docName + '\n' + docURL + '\n');

  //DaysSinceUpdate = (new Date() - file.getLastUpdated())/(1000 * 60 * 60 * 24)
  //if ( DaysSinceUpdate > 90 ) continue;  // skip if file hasn't been updated for more than 7 days   

  if (docsAlreadyChecked.toString().indexOf(docName)>0) continue;  // skip if already done    // note this needs fixing as will fail if one doc is substring of another

  var ssIn = SpreadsheetApp.openByUrl(docURL); // open doc

  for (var i = 0; i < ssIn.getNumSheets(); i++) {  //loop thru sheets in doc
    sheetname = ssIn.getSheets()[i].getName();
    //sheetid = ssIn.getSheets()[i].getSheetId();
    if (ssIn.getSheets()[i].getMaxRows()==0) continue; //skip if no rows (eg if it's a chart)
    ListFormulae(docURL, sheetname, keyword);
  } // end for loop thru sheets

  //strHyperlink = "=hyperlink(\"" + docURL + "#gid=" + ssIn.getSheets()[i].getSheetId() + "\", \"" + docName + "\")";
  strHyperlink = "=hyperlink(\"" + docURL  + "\", \"" + docName + "\")";
  sheetOut.appendRow([strHyperlink, '', '', 'finished search ' + new Date() ]);

} // end while loop thru files

}

function ListFormulae(docURL, sheetname, keyword) {


var ssIn = SpreadsheetApp.openByUrl(docURL); 
var sheetIn = ssIn.getSheetByName(sheetname);
//var sheetIn = ssIn.getSheetId(sheetid);
//var sheetname = ssIn.getSheetName();
var sheetOut= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output");
LastRow = sheetIn.getLastRow();
LastColumn = sheetIn.getLastColumn();
if (LastRow==0 && LastColumn==0)  return;  // nothing in sheet 

var range = sheetIn.getRange(1, 1,LastRow , LastColumn);
var formulas = range.getFormulas();
for (var i in formulas) {
  for (var j in formulas[i]) {
    if (formulas[i][j]=="") continue;  // skip if no formula
    if (formulas[i][j].search(keyword) == -1) continue;  //skip if keyword not found
    strHyperlink = "=hyperlink(\"" + docURL + "#gid=" + sheetIn.getSheetId() + "\", \"" + ssIn.getName() + "\")";

    rownum = parseInt(i)+1;
    colnum = parseInt(j)+1;

    sheetOut.appendRow([strHyperlink, sheetname, 'R' + rownum + 'C' + colnum, "'" + formulas[i][j]]);
  }
}
}
person Alex Taylor    schedule 19.02.2020
comment
Если кто-нибудь может предложить способы ускорить этот скрипт, он будет очень признателен. Мне нужно отследить тонну зависимостей, и хотя этот сценарий намного быстрее, чем ожидание того, что кто-то сообщит о листе как о сломанном, он все же немного утомителен, если у вас несколько сотен листов! Конечно, одним из вариантов является ручная фильтрация пространства поиска, но, возможно, Google предлагает поиск по массиву, который быстрее, чем цикл for. Спасибо - person Alex Taylor; 19.02.2020