【MACRO】Google Apps Script 質問スレ【DRIVE】
Google Apps Script でのプログラミング等に関する質問スレです Excel や Access の VBA に不満のあるあなた web アプリだけでなくクライアントアプリからも利用したいあなた ローカルなデータベースやファイルだとバックアップに不安のあるあなた ム板に無かったので立ててみます Google Apps Script ttps://developers.google.com/apps-script/ Google Drive API ttps://developers.google.com/drive/ Getting Started with the Google Data Python Library ttps://developers.google.com/gdata/articles/python_client_lib ■関連スレ Google Maps API 質問箱 http://peace.2ch.net/test/read.cgi/tech/1131627583/ Microsoft SkyDrive API http://peace.2ch.net/test/read.cgi/tech/1385604796/ 【GoogleAppsScript】猿92【研究せよ!!!】 http://nozomi.2ch.net/test/read.cgi/php/1398600864/ GoogleAPIってどうよ? http://nozomi.2ch.net/test/read.cgi/php/1018614427/ Google App Engine for Python 6アプ目 http://nozomi.2ch.net/test/read.cgi/php/1358570953/ Google App Engine for java http://peace.2ch.net/test/read.cgi/tech/1317639323/ GoogleWebToolkit[GWT]について語ろう http://nozomi.2ch.net/test/read.cgi/php/1147975874/ >>388 ありがとうございます。確かにそのページによるとサポートされてなさそうですね。 stackoverflowでいくつかの同様な質問を見つけましたが、できない的なことが書かれてました。 visibleの件ももう少し調べてみて、できそうになかったら諦めます。 var triggerUniqueId = ScriptApp.newTrigger("doPost2") .timeBased() .after(100) .create() .getUniqueId(); これを実行すると以下の3パターンの動作になるのだがなんとかならないかな? ・すぐにdoPost2に飛んでくる ・数秒〜数十秒後にdoPost2に飛んでくる ・どんだけ待とうがdoPost2に飛んでこない(何分か待ってれば飛んでくるのか?) ちなみに飛んでこなかった場合は全てのトリガを削除してからやり直してる。 微妙に勘違いされそうな書き方だったので追記 doPost2に飛んできたときはその中でトリガを削除しているので 「飛んでこなかった場合は全てのトリガを削除してからやり直してる。」ということです。 100ms後にdoPost2に飛ばしたいってこと? 最終的になにがしたいかわからん そのidでなにすんの? 目先の目的は「指定した時間後にdoPost2を実行したい」です。 100msが1秒になるにはまだ許容範囲ですが、 さすがに数十秒後やかなり待っても飛んでこないのはなにか設定がおかしいのかなと。 トリガーをつくるのではなく、Utilities.sleepじゃダメ? 大雑把に以下のような流れになるのでsleepでは無理っす。 1, PayPalからPOSTがくる 2, PayPalにHTTP 200を返す 3, PayPalにPOSTを投げる https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNIntro/ function doPost(e) { トリガ仕掛ける HTTP 200を返す } function doPost2() { POSTを投げる } いろいろ試したけど60秒とか大きな値ならそれっぽいタイミングでトリガがかかるみたい。 短すぎる設定時間はダメなのかなぁ。 トリガの指定って分単位だった気がする 内部的にcronだから ○時ちょうどにトリガー仕掛けたくて試したけど無理で、59分にしかけて00秒まで待つって実装にしたことがある 非同期処理ができないから難しいかも 秒数は一定じゃないから、1分後にトリガー設定しても最大1分59秒後になることもある にしても面倒な仕様だなPaypal VBAのCall ステートメントは、Google Apps Scriptの場合どう記述すればいいですか? アクティブシートのカーソルがあるセル(アクティブセル)の行番号を、別のシート(setei)のB1へコピーしたいのですが、 うまく行きません。 5行目のvar copyValue〜の値をmsgBoxで出力すると、希望通りの値が出ているので、そこまでは合っていると思うのでが、 6行目で取得した行番号を、別のシートのB1に入れる所で躓いています。解決方法を教えて頂けないでしょうか? function myFunction() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet_copyFrom = sheet.getActiveSheet(); var sheet_copyTo = sheet.getSheetByName('setei'); var copyValue = sheet_copyFrom.getActiveCell().getRow(); sheet_copyTo.getRange('B1').setValues(copyValue); } 行番号をコピーするの?アクティブセルの値じゃなくて? sheet_copyTo.getRange('B1').setValue(copyValue); >>401-402 希望どうりのことができました。ありがとうございます! スペルが間違っていたとは・・ 質問です。 スプレッドシートのシートを並び替えることはできますか? セル範囲のデータならSORTでできることは知っているのですが、シートには使えませんよね。 日付がシート名になってて、それを昇順に並び替えしたいのです。 よろしくお願いします。 出来ないことはなだろうが面倒くさいし、丸投げならお断り。 IDかわりましたけど404です。 >>405 めんどくさい方法ですけど、一応自分で作ってはみました。 これよりいい方法があるのか、改めてお知恵をお貸しください。 var ss = SpreadsheetApp.openById(file.getId()); var sheets = ss.getSheets(); // シート名(yyyyMMdd形式)で昇順ソート sheets.sort(function(a, b){ var aa = Number(a.getSheetName()) || a.getSheetName(); var bb = Number(b.getSheetName()) || b.getSheetName(); if (aa < bb) return -1; if (aa > bb) return 1; return 0; }); // 別スプレッドシートにコピー for (var n in sheets) { var sheet = sheets[n]; var sheetName = sheet.getSheetName(); sheet.copyTo(sortedSs).setName(sheetName); } 同じスプレッドシートでの並べ替えを諦めて、別スプレッドシートにソート済みをコピーしたってだけのものです。 1.シート数を取得 2.全シート名を配列へ 3.配列をソート array.sort() 4.シートを移動 >>407 4. シートを移動 これができなくて悩んでたんですが SpreadsheetオブジェクトにinsertSheetメソッドやmoveActiveSheetメソッドがありますね。 何とか実装できそうです。 ありがとうございました。 getValuesで取得した二次配列の、あるインデックス番号Ary[n][n]から、セル番号を取得するにはどうすれば良いでしょうか? 又、それはAPIを使わず、javaの配列処理の中で完結できるものなのでしょうか? gasなのかわからないですが、間違いならすみません。 フォームで@郵便番号を入れたら住所の一部を表記させたいのですが、できるのでしょうか? A特定の数字をいれたら、外部からその数字に該当するデータを引っ張れるでしょうか?(社員コードいれなら社員名がでるイメージです) 誠にすみませんが、可能ならばご教授 おねがいします。 gasはさわったことないので、できそうならば、やってみたいとおもいます。 >>413 1.できます 2.できます 3.ajax >>414 おしえてくださいばっかりでもうしわけありませんが、本当に素人でして。 コードやら参考のURLでもありましたらおねがいします。 /** * @return ライブラリ名 */ とやっているのに返り値のメソッド補完が効きません… 何か間違っているでしょうか… >>418 コメント付けると補完が効くようになると聞きました 外部サイトで申し訳ないのですが、GASについて下記のサイトのチュートリアルを試していたのですが ttps://tonari-it.com/gas-web-appli-spreadsheet-append/ 真似をしてみても、エラー出てしまいます。 getActiveSheet を呼び出す権限がありません(行 2、ファイル「test2」、プロジェクト「HTMLページ表示」) 自分のコードが間違えたのかと、コードをコピペしたり、スクリプト認証を再度許可を出すために 現在とは別にファイルを作り直したりしたのですが、同じエラーが出てしまいます。 このエラーを回避するにはどうすれば良いでしょうか? すみません自己解決しました。 原因はスクリプトにプロジェクトのトリガーを設定していなかったことが原因だった様です。 公開済みのHTMLなのでアクセスすれば良いだけでなのに、なんでや!と思っていたのですが、 googleのwebアプリの場合、公開時にアサインされるHTMLへのリンクは、実はHTMLへのリンクではなく、 リンク > Ajax > .gs > html という流れらしく(たぶん) 3番目の.gsにトリガーが設定されてないとダメという感じの様です。なので.gsのトリガー設定した所動きました。 [設定したトリガー] 実行:doGet イベント:スプレッドシートから・起動時に設定 このトリガー自体適当に設定したので、spreadsheetに紐付いた(コンテナバウンド)webアプリがこのトリガーで本当に良いのか? .gsがスタンドアローンだったらどうするのか?などは自分の知識ではまだ不明です。 割と有名(みんなが引っかかる)ワナらしく、「GAS 実行する権限がありません」でググると色々出てきます。 すみませんが質問させてください。 現在、google appsのみで簡易ウェブアプリの制作を試みています。 構成は htmlservice+gas+spredseet(DB) です。 各種申請をweb化するのですが、アクセスしたユーザーのgmailアドレスもDBに格納します。 session.getactiveuser().getemailを利用するため、スクリプトの実行者は「アプリケーションアクセスしているユーザー」にしています。 そうすると、spreadsheetも全員に公開する必要がありますが、spreadsheetの中身は個人情報を少し含むため見られたくありません。 なにかいい方法はありますでしょうか、、、fusiontablesなどであればできるのでしょうか? ユーザーごとの情報はユーザープロパティに入れるべきでは? >>429 ご助言ありがとうございます。 propaties serviceについて調べた見ましたが、ユーザープロパティとして保存した場合、他のユーザーからは一切アクセスできないものと思いました。 一部のユーザー(システム管理を行う数名)に対しては、データの参照ができるようにしたいと思ったおります(申請されたデータを承認するようなワークフローアプリを検討しているため。後出して申し訳ありません) サイズが十分小さければスクリプトプロパティかな。 たしか500KBくらいまで。 あるいは、スプレッドシートにスクリプトを付属させるんじゃなく、 独立プロジェクトにして、openByIdとかopenByUrlとかは? >>431 ご助言ありがとうございます。 プロパティについては、思いの外データの種類が増えそうなため難しそうです。 スクリプトをスタンドアロンにして、openbyidがいいですかね、万一idがバレてしまった時のことが不安ですが、そういったことは起こらないと思っていい感じでしょうか。 for (var i = 1; i <= ss.getLastRow() ; i++){ ss.getRange(x,y).setFormula('=IMPORTHTML("https://www.yahoo.co.jp" ;,"table"1+i,'); } for分の中で関数の最後の部分を1ずつ足していきたいのですが、セルに出力された際は「i」の部分は数字としては見てくれません。 1つずつ足していく方法はありますでしょうか。 >>433 ありがとうございます。 ライブラリ化するということでしょうか。 getEmailする部分を別アプリ(アプリにアクセスしているユーザー実行)にして、spreadsheet操作をするアプリはオーナーとして実行する感じでしょうか。 調べてみます。 >>432 >そういったことは起こらないと思っていい感じでしょうか マーフィーの法則というのがあってだな そういう起こって欲しくないことは起こるんだ 自己解決しました。 ss.getRange(x,y).setFormula('=IMPORTHTML("yahoo.co.jp","table",1+'+i+')'); googleドライブにアップしたエクセルxlsを自動でspreadsheetに変換するコードはありますか すべてのシートで文字の一括置換をしたいのだけど、セル毎に処理するしかないのかな? >>440 検索してなんとなくできそうなのでやってみます ありがとうございました GAS単体でajaxのようなwebページをクローリングすることは可能ですか? やっぱり外部を通さないと無理でしょうか スプレッドシートの制御をAndroidから行う方法をご教示頂けませんでしょうか。 内容としては複数列のソートを行いたいのです。 現状は列指定でソートをかけているのですが、列数が多く余分な時間がかかります。 PCからは実行できているのですが、同様の事がAndroid上から行えたらと思います。 実行用のトリガーがAndroidで使用できずに困っております。 現状トリガーは図形に対してスクリプト実行させていますが、タップしてもAndroidでは削除しか出てきません。 function onOpen()とmenuEntries.push使えば? https://script.google.com/dashboard/quota ↑にあるトリガーの合計実行時間や、URLFetch の呼び出し、URLFetch のデータの受信が 現在どのくらい使用されている分かるページは無いですか? https://console.developers.google.com GoogleドライブAPIなら↑でわかるのにそれ以外載って無くて… サーバー側でjqueryって使えますか? WebスクレイピングのHTMLパーサとしてjqueryを使いたいのですが… >>447 npmでjQueryをinstall webpackでbundle node-google-apps-scriptでアップロード って感じでいけないかな? 試してないのでできるか分からないけど Googleドライブにあるスプレッドシートを JSONファイルを返すウェブアプリケーションとして使ってるんだが JSONデータがブラウザにキャッシュされなくて困っている cache-control:no-cache pragma:no-cache expires:Mon, 01 Jan 1990 00:00:00 GMT というhttpヘッダを返してきてキャッシュさせてくれないんだが、 このヘッダを書き換える方法は無いか? 一ヵ月に1度、2度くらいしか更新されないデータだが、毎日頻繁に参照されるもので データが1.4MBデカい為、変更されたときだけ読み込むようにヘッダを書き換えたい >>447 こないだ同じような用途でjsdomとjquery使ったわ。 たしかこんなかんじ var JSDOM = require('jsdom').JSDOM; JSDOM.fromUrl('https://example.com/' ).then(function(dom) { var window = dom.window; var jQuery = $ = require('jquery')(window); // ここから$('ul#hoge > li.huga')とか普通に使えるはず }); GASって「const 定数名 = 1;」 みたいな記述できない? varしか無理? constはランタイムエラー letは通る だったような記憶 addMenuでスプレッドシートに追加する独自メニューを条件によって選択不可にすることはできますか? 通常のメニューと同じようにグレーアウトして選択できないようにしたいです。 1日1回、UrlFetchでページネイションされた数十ページを取得したいのですが 負荷軽減のため数秒は間隔を明けて取得したいです settimeoutでエラーがでるのは、GASでは使えないということなのでしょうか? 出来ないとしたら代替方法の検索のヒントなどを教えていただきたいです GASってひょっとしてfor(let data of datas)みたいな構文は通らないのか? for each(let data in datas)は通った GASまじか・・・ >>459 setTimeoutはブラウザでしか効かないんじゃ Utilities.sleep(ミリ秒)使おう >>460 >>461 良し悪しはわからないけど for (var n in datas) { var data = datas[n]; ... } とかしてた ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ すみません、ちょっとお門違いなんですが、 Microsoft系でGoogle Apps Scriptに相当するようなサービスって何でしょうか? officeアドイン(javascript api) vba excelだけじゃなく、officeは全部使える Google Spreasheetみたいにクラウドに置いたときに、 定期的に動かしたり、Webアプリとして呼び出せたりするんでしょうか? 共有スプレッドシートで自分だけのスクリプトを動かすことができますか? スプレッドシートでハイパーリンクになっていないセルの、テキストとURL取得するには、どうすれば良いですか? >>479 ハイパーリンクになってないならできない そもそもセルにurlがvalueとして入力されてるなら別だが しょうもない質問ですが職場などで何て呼んでるでしょうか ジーエーエス? グーグルアップス? こないだガスって言ってる人がいて自分の職場では全く統一されていないです >>481 ガスって呼んでる ??ってなる人には「Google Apps Scriptの略」って付け加える >>482 ありがとうございます ガスが一般的なんですかね 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 WX5I9 <HEAD>タグの中に文字コードの設定<meta charset= がある場合は、文字コードを抜き出すプログラムを組んでいます。(下記の関数) function getEntag(response){ var myRegexp = /<HEAD>([\s\S]*)<\/HEAD>/gi; var elems = response.getContentText().match(myRegexp); var myEncode = /<meta charset="(.+?)">/gi; var myEncodeR = elems.getContentText().match(myEncode); // ←この行でエラーが出る return myEncodeR; } エラーの内容 TypeError: オブジェクト「文字列文字列文字列文字列文字列」で関数 getContentText が見つかりません。 なぜ response.getContentText().match(myRegexp); はうまくいくのに var myEncodeR = elems.getContentText().match(myEncode); はうまくいかないのでしょうか? GASでpdfを作成したいと思い サイトを参考に出せるようになったのですが 余白の設定オプションを教えていただけないでしょうか? exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx size: "A4", // 用紙サイズの指定 legal / letter / A4 portrait: "true", // true → 縦向き、false → 横向き fitw: "true", // 幅を用紙に合わせるか sheetnames: "false", // シート名をPDF上部に表示するか printtitle: "false", // スプレッドシート名をPDF上部に表示するか pagenumbers: "false", // ページ番号の有無 gridlines: "false", // グリッドラインの表示有無 fzr: "false", // 固定行の表示有無 ここら辺のオプションワードをつけてGoogle検索して見たのですが見つからないでいます よろしくおねがいいたします read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる