Jak usunąć komórkę i ponownie wprowadzić te same dane w Arkuszach Google
Obecnie szukam sposobu na zautomatyzowanie pobierania danych dotyczących ceny akcji.
na początku myślałem, że aby zaktualizować wartość komórki, wystarczy odświeżyć instrukcję importxml w komórce. więc użyłem tego kodu z funkcji arkusza kalkulacyjnego Okresowo odświeżaj IMPORTXML ()
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.
// At this point, we are holding the lock.
var id = "YOUR-SHEET-ID";
var ss = SpreadsheetApp.openById(id);
var sheets = ss.getSheets();
for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {
var sheet = sheets[sheetNum];
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var tempFormulas = [];
for (var row=0; row<formulas.length; row++) {
for (col=0; col<formulas[0].length; col++) {
// Blank all formulas containing any "import" function
// See https://regex101.com/r/bE7fJ6/2
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
if (formulas[row][col].search(re) !== -1 ) {
tempFormulas.push({row:row+1,
col:col+1,
formula:formulas[row][col]});
sheet.getRange(row+1, col+1).setFormula("");
}
}
}
// After a pause, replace the import functions
Utilities.sleep(5000);
for (var i=0; i<tempFormulas.length; i++) {
var cell = tempFormulas[i];
sheet.getRange( cell.row, cell.col ).setFormula(cell.formula)
}
// Done refresh; release the lock.
lock.releaseLock();
}
}
najwyraźniej NIE aktualizuje komórki ... więc odkryłem, że aby odświeżyć komórkę, muszę
- usuń nazwę akcji
- wprowadź ponownie nazwę akcji
tutaj jest film pokazujący, co przez to rozumiem (żeby było jasne) https://streamable.com/eciks0
jak mogę to zautomatyzować, może używając skryptu arkusza Google?
Dziękuję Ci
EDYCJA: tutaj jest kopia arkusza Google, z którym pracuję
https://docs.google.com/spreadsheets/d/1BFz3LHWEw-wT9exJv558mAFOv-fIKPINaplmzRY24kw/edit?usp=sharing
spróbuj wykonać jego kopię.
jeszcze raz dziękuję za pomoc
Odpowiedzi
Z próbki wideo, w sytuacji, kiedy myślałem, że wartości komórek „B9” i „B10” są włączone url
i xpath
od wzoru =IMPORTXML(url, xpath)
, gdy wartość komórki „B1” zmienia się formuła jest odświeżany. A co z następującym przykładowym skryptem?
Przykładowy skrypt:
Skopiuj i wklej następujący skrypt do edytora skryptów arkusza kalkulacyjnego Google i uruchom funkcję myFunction
. W tym przykładowym skrypcie wartość komórki „B1” jest zastępowana przez newValue
.
function myFunction() {
var newValue = "###"; // Please set the new value.
var sheetName = "Sheet1"; // Please set the sheet name.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
sheet.getRange("B1").setValue(newValue);
}
Jeśli powyższy skrypt nie jest przydatny i chcesz użyć skryptu również w swoim pytaniu, możesz użyć następującego skryptu. W takim przypadku należy ustawić
var id = "YOUR-SHEET-ID";
aktualną sytuację.function myFunction() { var newValue = "###"; // Please set the new value. var sheetName = "Sheet1"; // Please set the sheet name. var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange("B1").setValue(newValue); RefreshImports(); // <--- Added }
Albo myślę, że możesz użyć następującego skryptu do odświeżenia formuł w arkuszu.
function myFunction2() { var newValue = "###"; // Please set the new value. var sheetName = "Sheet1"; // Please set the sheet name. var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange("B1").setValue(newValue); var formula = "="; var tempFormula = "=sample"; sheet.createTextFinder(`^\\${formula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula); sheet.createTextFinder(`^\\${tempFormula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula); }
Bibliografia:
- Powiązane wątki
- Funkcje niestandardowe i przeliczanie
- Funkcja TERAZ () + Ustawianie strefy czasowej (Arkusze Google)
Dodany:
A co z Twoją odpowiedzią i udostępnionym filmem, co powiesz na następujący przykładowy skrypt? W tym przypadku, jako prosty skrypt, komórka jest czyszczona i ponownie umieszczana jest wartość acen
.
Przykładowy skrypt:
function myFunction() {
var newValue = "acen"; // Please set the new value.
var sheetName = "Sheet1"; // Please set the sheet name.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var range = sheet.getRange("B1");
range.clearContent();
SpreadsheetApp.flush();
range.setValue(newValue);
}
GetEmCheckEm And BouncEm
Górna funkcja pozwala wybrać wszystkie komórki, które chcesz odbijać. Użyj klawisza Ctrl i zaznacz wszystkie komórki, a następnie uruchom getThem ();
function getThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Sheet1');
const rgl=sh.getActiveRangeList();
let rlA=[];
rgl.getRanges().forEach(function(rg,i){
let h=rg.getHeight();
let w=rg.getWidth();
let row=rg.getRow();
let col=rg.getColumn();
for(let i=0;i<h;i++) {
for(let j=0;j<w;j++) {
rlA.push(sh.getRange(Number(row+i),Number(col+j)).getA1Notation());
}
}
});
PropertiesService.getScriptProperties().setProperty('mystocks',JSON.stringify(rlA));
ss.toast("Process Complete");
}
Po ich utworzeniu możesz kliknąć ekran, aby wyczyścić wybór. Uruchomienie checkThem () i wybrane opcje powinny pojawić się ponownie, ponieważ powinny zostać zapisane w usłudze PropertiesService.
function checkThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const rangeList=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks')));
sh.setActiveRangeList(rangeList);
ss.toast('Process Complete');
}
Teraz możesz uruchomić bounceThem (), a wartości znikną, a następnie pojawią się ponownie
function bounceThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const list=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks')));
let data=[];
list.getRanges().forEach(r=>{data.push(r.getValue());r.setValue('');});
SpreadsheetApp.flush();
Utilities.sleep(5000);
list.getRanges().forEach((r,i)=>{r.setValue(data[i]);});
SpreadsheetApp.flush();
ss.toast("Process Complete");
}

Okazało się, że to raczej działa, więc wróciłem dziś rano i skonfigurowałem go tak, aby używał setValues () zamiast setValue () i teraz jest znacznie szybsze odbijanie.
function getThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Sheet1');
const rgl=sh.getActiveRangeList();
console.log(sh.getName());
let rlA=rgl.getRanges().map(function(rg){return rg.getA1Notation();});
PropertiesService.getScriptProperties().setProperty('mystocks1',JSON.stringify(rlA));//Stored as JSON in property service
ss.toast("Process Complete");
}
function checkThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const rangeList=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks1')));
sh.setActiveRangeList(rangeList);
ss.toast('Process Complete');
}
function bounceThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const list=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks1')));
let data=[];
list.getRanges().forEach(function(rg){
let sA=rg.getValues();//the stored array
data.push(sA);
let nA=[];//this is the null array to remove data
sA.forEach(function(r,i){
nA[i]=[];
r.forEach(function(c,j){
nA[i][j]='';
});
});
rg.setValues(nA);//removing data
});
SpreadsheetApp.flush();//insure all data is visible on the sheet
Utilities.sleep(5000);//5 second bounce delay
list.getRanges().forEach(function(r,i){r.setValues(data[i]);});//Replacing all data as 2d arrays
SpreadsheetApp.flush();//Making sure data is complete and visible
ss.toast("Process Complete");
}

W zależności od tego, ile masz kolumn, po prostu nagrałbym makro akcji (Narzędzia> Makra> Zarejestruj makro) i po zakończeniu postępuj zgodnie z instrukcjami w odpowiedzi zamieszczonej w poniższym pytaniu, aby zautomatyzować jego odświeżanie, jak często byś tego chciał biegać
Czy można zautomatyzować skrypty arkuszy kalkulacyjnych Google (np. Bez zdarzenia, które je wywoła)?