Есть ли способ просмотреть все листы Google, которые ссылаются / зависят от другого? - PullRequest
0 голосов
/ 30 января 2020

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

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

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

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

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

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Чтобы найти зависимости между листами в разных документах (или даже в одном и том же документе), используйте следующий скрипт для поиска ссылок на заданный идентификатор do c (например, в 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]]);
  }
}
}
0 голосов
/ 19 февраля 2020

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

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

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

...