id
웹 서비스 (가격)를 수신하고 정보를 가져 오는 맞춤 Google Apps 스크립트를 작성했습니다 .
이 스크립트를 스프레드 시트에서 사용하는데 잘 작동합니다. 내 문제는 이러한 가격이 변경되고 내 스프레드 시트가 업데이트되지 않는다는 것입니다.
스크립트를 다시 실행하고 셀을 업데이트하도록 강제 할 수 있습니까 (각 셀을 수동으로 이동하지 않고)?
id
웹 서비스 (가격)를 수신하고 정보를 가져 오는 맞춤 Google Apps 스크립트를 작성했습니다 .
이 스크립트를 스프레드 시트에서 사용하는데 잘 작동합니다. 내 문제는 이러한 가격이 변경되고 내 스프레드 시트가 업데이트되지 않는다는 것입니다.
스크립트를 다시 실행하고 셀을 업데이트하도록 강제 할 수 있습니까 (각 셀을 수동으로 이동하지 않고)?
답변:
좋아, 내 문제는 Google이 이상한 방식으로 작동하는 것 같습니다. 스크립트 매개 변수가 유사한 한 스크립트를 다시 실행하지 않고 이전 실행의 캐시 된 결과를 사용합니다. 따라서 API에 다시 연결하지 않고 가격을 다시 가져 오지 않으며 단순히 캐시 된 이전 스크립트 결과를 반환합니다.
자세한 정보는 https://code.google.com/p/google-apps-script-issues/issues/detail?id=888을 참조하세요.
및 여기 : 업데이트되지 않는 데이터를 요약하는 스크립트
내 해결책은 스크립트에 사용하지 않는 다른 매개 변수를 추가하는 것이 었습니다. 이제 이전 호출과 다른 매개 변수를 사용하여 함수를 호출하면 이러한 매개 변수의 결과가 캐시에 없기 때문에 스크립트를 다시 실행해야합니다.
따라서 함수를 호출 할 때마다 추가 매개 변수에 대해 "$ A $ 1"을 전달합니다. 또한 새로 고침이라는 메뉴 항목을 만들었고 실행하면 현재 날짜와 시간이 A1에 저장되므로 $ A $ 1을 두 번째 매개 변수로 사용하여 스크립트에 대한 모든 호출을 다시 계산해야합니다. 내 스크립트의 코드는 다음과 같습니다.
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Refresh",
functionName : "refreshLastUpdate"
}];
sheet.addMenu("Refresh", entries);
};
function refreshLastUpdate() {
SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}
function getPrice(itemId, datetime) {
var headers =
{
"method" : "get",
"contentType" : "application/json",
headers : {'Cache-Control' : 'max-age=0'}
};
var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
var jsonObj = eval( '(' + jsonResponse + ')' );
return jsonObj.Price;
SpreadsheetApp.flush();
}
그리고 ID가 5 인 항목의 가격을 셀에 넣으려면 다음 공식을 사용합니다.
=getPrice(5, $A$1)
가격을 새로 고침하려면 "새로 고침"-> "새로 고침"메뉴 항목을 클릭하면됩니다. onOpen()
스크립트 를 변경 한 후 스프레드 시트를 다시로드해야합니다 .
나는 이것이 약간 오래된 질문이라는 것을 알고 있습니다. 그러나이 방법은 변경하는 것 외에는 사용자 작업이 필요하지 않습니다.
내가 한 일은 tbkn23과 비슷했습니다.
재평가하려는 함수에는 사용되지 않은 추가 매개 변수 $ A $ 1이 있습니다. 그래서 함수 호출은
=myFunction(firstParam, $A$1)
그러나 코드에서 함수 서명은
function myFunction(firstParam)
새로 고침 기능을 사용하는 대신 다음과 같은 onEdit (e) 함수를 사용했습니다.
function onEdit(e)
{
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}
이 함수는 스프레드 시트의 셀이 편집 될 때마다 트리거됩니다. 이제 셀을 편집하고 난수를 A1에 배치하면 tbkn23이 제안한대로 매개 변수 목록이 새로 고쳐져 사용자 정의 함수가 재평가됩니다.
NOW()
사용자 정의 함수가 아닌 내장 함수입니다.
이것은 매우 오래된 스레드 일 수 있지만 방금 지금처럼 이것을하려는 누군가에게 유용 할 수 있습니다.
Lexi의 스크립트를있는 그대로 사용하면 현재 Sheets에서는 더 이상 작동하지 않는 것 같지만, 매개 변수로 함수에 더미 변수를 추가하면 (실제로 함수 내에서 사용할 필요가 없음) 실제로 Google 시트가 페이지를 다시 새로 고치도록 강제합니다.
따라서 다음과 같은 선언 : function myFunction (firstParam, dummy) 및 호출은 제안 된대로됩니다. 그것은 나를 위해 일했습니다.
또한 편집하는 모든 시트에 무작위 변수가 나타나는 것이 성가신 경우 한 시트로 제한하는 쉬운 해결 방법은 다음과 같습니다.
function onEdit(e)
{
e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
/*@customfunction*/
function sheetNames(e) {
return SpreadsheetApp.getActive()
.getSheets()
.map(function(sheet) {
return sheet.getName();
});
}
/*Create a installable trigger to listen to grid changes on the sheet*/
function onChange(e) {
if (!/GRID/.test(e.changeType)) return; //Listen only to grid change
SpreadsheetApp.getActive()
.createTextFinder('=SHEETNAMES\\([^)]*\\)')
.matchFormulaText(true)
.matchCase(false)
.useRegularExpression(true)
.replaceAllWith(
'=SHEETNAMES(' + (Math.floor(Math.random() * 500) + 1) + ')'
);
}