Chcę zrobić portfolio Tracker, który bierze informacje z Internetu i aktualizacji co minutę (Time Trigger) Plus - za pomocą przycisku (ta część nie jest bardzo istotna, że mam).

Oto przykładowy arkusz z jakimś przykładem danych: https://docs.google.com/spreadsheets/d/ 1ikqv-xthkel6vodpkg9qotng31o09szmpdaozzam4qs / edytuj? USP = Udostępnianie

Próbowałem skryptu do kopiowania z powrotem do tej samej komórki w jednym ruchu, ale nie wyzwala arkuszy, aby odświeżyć dane.

Myślę, że jeśli zakres jest pobierany z istniejącej pozycji, przeniósł się do drugiego i (tutaj jest to, gdzie się nie powiedzie), to musi działać. Raz aktualizuje się po przeniesieniu.

Znalazłem skrypt, który działa idealnie na bok. Ale nie jestem w stanie dotrzeć do końca.

Co próbowałem:

  • Tworzenie dwóch funkcji działają po drugim z wahonymi zakresami;
  • Dokonywanie oddzielnych sourcerów, docelowych i source2range, target2Range o tej samej logiki.
  • podejmowanie podobnych, ale z przepłukami między nimi;
  • Tworzenie jednej funkcji, aby wykonać wszystkie ruchy po drugim;

Żaden z powyższych pracowników nie przekazał punktu, w którym znajduje się jeden raz. Oto używane opcje kodu:

function refreshPortfolioData() {
  var activeSheet,numberOfSourceColumnsToGet,sourceColumnStart,sourceFormulas,sourceRange,
      sourceRowStart,targetColumn,targetRange,targetRowStart;

  //USER INPUT

  sourceRowStart = 6; //Row to start getting formulas from
  sourceColumnStart = 7; //Column to start getting formulas from
  numberOfSourceColumnsToGet = 1; //Number of columns to get formulas from

  targetRowStart = 6; //Row to start copying formulas to
  targetColumn = 21; //Column to start copying formulas to

  //END OF USER INPUT

  activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources');
  sourceRange = activeSheet.getRange(sourceRowStart, sourceColumnStart, activeSheet.getLastRow(), numberOfSourceColumnsToGet);

  sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

  targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

  targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range
  
  targetFormulas = targetRange.getFormulas();//Get only formulas from the source range
  
  //SpreadsheetApp.flush()

  sourceRange.setFormulas(targetFormulas);//Copy the formulas to the target range
  }

Przykład rozszerzenia, aby odwrócić zmiany:

  <...>
  SpreadsheetApp.flush()
  var activeSheet,numberOfSourceColumnsToGet,sourceColumnStart,sourceFormulas,sourceRange,
      sourceRowStart,targetColumn,targetRange,targetRowStart;

  //USER INPUT

  sourceRowStart = 6; //Row to start getting formulas from
  sourceColumnStart = 21; //Column to start getting formulas from
  numberOfSourceColumnsToGet = 1; //Number of columns to get formulas from

  targetRowStart = 6; //Row to start copying formulas to
  targetColumn = 7; //Column to start copying formulas to

  //END OF USER INPUT

  activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources');
  sourceRange = activeSheet.getRange(sourceRowStart, sourceColumnStart, activeSheet.getLastRow(), numberOfSourceColumnsToGet);

  sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

  targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

  targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range
  }

Czy ktoś może mi pomóc w opcjach tutaj?

1
Povi1as 13 marzec 2021, 19:37

1 odpowiedź

Najlepsza odpowiedź

Punkty modyfikacji:

  • Aby odświeżyć formuły w arkuszu kalkulacyjnym Google, wydaje się, że jest to wymagane, aby zastąpić innych z bieżących wzorów. W skrypcie, te same wzory są nadpisane. Myślałem, że może to być powód twojego problemu.
  • W twojej sytuacji pomyślałem, że sourceFormulas może być w stanie bezpośrednio umieścić do sourceRange zamiast targetRange przy użyciu clearContent().

Kiedy powyższe punkty zostaną odzwierciedlone w twoim skrypcie, wygląda to następująco.

Zmodyfikowany skrypt:

sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range

targetFormulas = targetRange.getFormulas();//Get only formulas from the source range

//SpreadsheetApp.flush()

sourceRange.setFormulas(targetFormulas);//Copy the formulas to the target range
sourceFormulas = sourceRange.getFormulas();
sourceRange.clearContent();
SpreadsheetApp.flush(); // This might not be required to be used.
sourceRange.setFormulas(sourceFormulas);

Uwaga:

  • Jako inne podejście, gdy Textufinder jest używany do sytuacji, staje się następującym.

      function sample() {
        var orgFormula = "=TRANSPOSE";
        var tempFormula = "=sample";
        const range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources').getRange("G6:G14");
        range.createTextFinder(orgFormula).matchFormulaText(true).replaceAllWith(tempFormula);
        range.createTextFinder(tempFormula).matchFormulaText(true).replaceAllWith(orgFormula);
      }
    

Bibliografia:

1
Tanaike 14 marzec 2021, 01:03