セルを削除して同じ詳細をGoogleスプレッドシートに再入力する方法
私は現在、株価のデータ取得を自動化する方法を作っています。
最初は、セルの値を更新するには、セル内のimportxmlステートメントを更新する必要があると思いました。定期的に更新する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();
}
}
どうやら、それはセルを更新しません..だから私はセルを更新するために、私はする必要があることを発見しました
- 株名を削除する
- 株名を再入力してください
これは私がそれが何を意味したかを示すビデオです(明確にするために) https://streamable.com/eciks0
おそらくグーグルシートスクリプトを使用して、これを自動化するにはどうすればよいですか?
ありがとうございました
編集:これは私が働いているグーグルシートのコピーです
https://docs.google.com/spreadsheets/d/1BFz3LHWEw-wT9exJv558mAFOv-fIKPINaplmzRY24kw/edit?usp=sharing
コピーしてみてください。
助けてくれてありがとう
回答
あなたのサンプルビデオから、あなたの状況では、私はセル「B9」と「B10」の値が中に含まれている場合と考えurl
及びxpath
式=IMPORTXML(url, xpath)
電池「B1」の値が変更され、式が更新されます。では、次のサンプルスクリプトはどうですか?
サンプルスクリプト:
次のスクリプトをコピーしてGoogleスプレッドシートのスクリプトエディタに貼り付け、の関数を実行してくださいmyFunction
。このサンプルスクリプトでは、セル「B1」の値が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);
}
上記のスクリプトが役に立たず、質問でもスクリプトを使用したい場合は、次のスクリプトを使用できます。この場合、
var id = "YOUR-SHEET-ID";
実際の状況に合わせて設定してください。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 }
または、次のスクリプトを使用して、シートの数式を更新できる可能性があると思います。
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); }
参照:
- 関連スレッド
- カスタム関数と再計算
- 関数NOW()+タイムゾーンの設定(Googleスプレッドシート)
追加:
返信と共有ビデオから、次のサンプルスクリプトはどうですか?この場合、単純なスクリプトとして、セルがクリアされ、の値がacen
再度入力されます。
サンプルスクリプト:
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とBouncEm
一番上の機能を使用すると、バウンスするすべてのセルを選択できます。コントロールキーを使用してすべてのセルを選択し、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");
}
それらを取得したら、画面をクリックして選択をクリアできます。checkThem()を実行すると、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');
}
これでbounceThem()を実行でき、値が消えてから再び表示されます
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");
}
これはかなり実行されていることがわかったので、今朝戻ってきて、setValue()の代わりにsetValues()を使用するように設定しました。これで、バウンスを実行する方がはるかに高速になります。
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");
}
列の数に応じて、アクションのマクロを記録し([ツール]> [マクロ]> [マクロの記録])、完了したら、以下の質問に投稿された回答の指示に従って、更新を自動化します。走る
Googleスプレッドシートスクリプトを自動化することは可能ですか(たとえば、スクリプトをトリガーするイベントなしで)?