So löschen Sie eine Zelle und geben dieselben Details in Google Sheets erneut ein
Ich mache gerade eine Möglichkeit, das Abrufen von Daten des Aktienkurses zu automatisieren.
Zuerst dachte ich, um den Wert der Zelle zu aktualisieren, muss ich nur die importxml-Anweisung in der Zelle aktualisieren. Also habe ich diesen Code aus der periodischen Aktualisierung der IMPORTXML () - Tabellenkalkulationsfunktion verwendet
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();
}
}
Anscheinend aktualisiert es die Zelle NICHT. Also habe ich festgestellt, dass ich es tun muss, um die Zelle zu aktualisieren
- Löschen Sie den Namen der Aktie
- Geben Sie den Namen der Aktie erneut ein
Hier ist ein Video, das zeigt, was ich damit gemeint habe (nur um es klar zu machen) https://streamable.com/eciks0
Wie kann ich dies automatisieren, möglicherweise mithilfe des Google Sheet-Skripts?
Danke
BEARBEITEN: Hier ist eine Kopie des Google Sheets, mit dem ich arbeite
https://docs.google.com/spreadsheets/d/1BFz3LHWEw-wT9exJv558mAFOv-fIKPINaplmzRY24kw/edit?usp=sharing
Bitte versuchen Sie eine Kopie davon zu machen.
Nochmals vielen Dank für die Hilfe
Antworten
In Ihrem Beispielvideo dachte ich in Ihrer Situation, dass die Formel aktualisiert wird , wenn die Werte der Zellen "B9" und "B10" in url
und xpath
der Formel enthalten sind =IMPORTXML(url, xpath)
und wenn der Wert der Zelle "B1" geändert wird. Wie wäre es also mit dem folgenden Beispielskript?
Beispielskript:
Kopieren Sie das folgende Skript, fügen Sie es in den Skripteditor von Google Spreadsheet ein und führen Sie die Funktion von aus myFunction
. In diesem Beispielskript wird der Wert der Zelle "B1" von überschrieben 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);
}
Wenn das obige Skript nicht nützlich ist und Sie Ihr Skript auch in Ihrer Frage verwenden möchten, können Sie das folgende Skript verwenden. In diesem Fall stellen Sie bitte
var id = "YOUR-SHEET-ID";
Ihre tatsächliche Situation ein.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 }
Oder ich denke, dass Sie möglicherweise das folgende Skript zum Aktualisieren der Formeln im Blatt verwenden können.
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); }
Verweise:
- Verwandte Themen
- Benutzerdefinierte Funktionen und Neuberechnung
- Funktion JETZT () + Zeitzone einstellen (Google Sheets)
Hinzugefügt:
Wie wäre es mit dem folgenden Beispielskript aus Ihrer Antwort und Ihrem freigegebenen Video? In diesem Fall wird die Zelle als einfaches Skript gelöscht und erneut mit dem Wert von versehen acen
.
Beispielskript:
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 und BouncEm
Mit der Top-Funktion können Sie alle Zellen auswählen, die Sie abprallen möchten. Verwenden Sie die Steuertaste, wählen Sie alle Zellen aus und führen Sie dann getThem () aus.
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");
}
Nachdem Sie sie erhalten haben, können Sie auf den Bildschirm klicken, um Ihre Auswahl zu löschen. Das Ausführen von checkThem () und Ihre Auswahl sollten erneut angezeigt werden, da sie in PropertiesService gespeichert worden sein sollten.
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');
}
Jetzt können Sie bounceThem () ausführen und die Werte verschwinden und erscheinen wieder
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");
}

Ich fand das ziemlich laufend, also bin ich heute Morgen zurückgekommen und habe es so eingerichtet, dass es setValues () anstelle von setValue () verwendet, und es ist jetzt viel schneller, den Sprung zu machen.
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");
}

Abhängig davon, wie viele Spalten Sie haben, würde ich einfach ein Makro der Aktion aufzeichnen (Extras> Makros> Makro aufzeichnen) und nach Abschluss die Anweisungen in der Antwort in der folgenden Frage befolgen, um die Aktualisierung zu automatisieren, wie oft Sie möchten laufen
Ist es möglich, Google Spreadsheets-Skripte zu automatisieren (z. B. ohne ein Ereignis, das sie auslöst)?