【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/ >>710 PWAは簡単にできる アイコンなんかは設定から好きにできる sw.jsも使える Google Formで条件分岐した先の選択肢をSpread Sheetから読み込んでFormを自動作成することってできます? できそうなら方法を教えていただきたいです 具体的には設問1はプルダウンで47都道府県を回答させてそれに応じて設問2は分岐 設問2は東京の人なら東京に関しての設問をSpread Sheetから読み込ませて作成するイメージです google drive で、あるフォルダの中に同じ名前のサブフォルダが沢山ある場合にそれらを結合してくれるスクリプトを作りたいんですが、参考になる記事などありませんでしょうか? サブフォルダa サブフォルダa サブフォルダa サブフォルダb サブフォルダb を サブフォルダa サブフォルダb にしたいです。サブフォルダたちの中身は消さずに移動させたいです。 1つのフォルダ内に、同じ名前のサブフォルダが2つ以上作れるの? そんなファイルシステムを見た事がない >>716 ラベルみたいな感じだから、フォルダ名もファイル名も重複可能なのよ 1つのファイルを(シンボリックリンクではなく)複数フォルダに格納したりもできるので、普通のファイルシステム感覚で使うと戸惑うことがある フォルダ名もファイル名も当てに出来ない 頼りになるのはIDだけ しかもIDには階層構造が無いω >>715 どストライクな回答ありがとうございます。 私がやりたいことそのもののようなので、 後ほどじっくり読んでトライしてみます。 >>714 です 毎月同じ名前のフォルダをGoogleドライブにアップロードすると、同じ名前のフォルダが2つずつできてしまい困っていたため、このような質問に至りました。 このスクリプトを作って実験してみようも思い、 同じ名前のフォルダを複数アップロードしようとすると、「更新しますか?」というメッセージが出てきて、「更新」を選ぶと、重複なくファイルやフォルダがアップロードされました。 したがってスクリプトは不要になってしまいました。 私の記憶だと以前は特に尋ねられることもなく、同じ名前のフォルダやファイルが二重に出来てしまっていた気がするのですが、、、、改善されたんですかね? Googleフォームの回答スプレッドシートで、回答上限数を設けたいです。 function myFunction() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var value = sheet.getRange("N2").getValue(); if(value >= 4) { form.setAcceptingResponses(false); } } N2にSUMIFでの計算結果を入れています。 上記スクリプトでif(value >= 4) { でエラーが出てしまいます。 どうしたらSUMIFの結果であるN2が「4」以上になったらフォームを閉じることが出来るのでしょうか? spreadsheetで、セルの罫線の設定有無を取得したいのですが、 setBorder()はあってもgetBorder()が見当たりません 罫線の有無を取得する方法は何かありませんか >>724 ありがとうございます! 英語は不得手ですが、読みながら試してみたいと思います GASを今日知ったレベルですが 複数1000件程度のpdfファイルがあります。 そのタイトルを一気に1つのスプレッドシートに入れることはできますか? 可能であればそのフォルダの階層別のタイトルも入るのがベストですが、難しければファイルにタイトルのみで充分です。 よろしくお願いいたします。 ファイルはもちろんGoogleドライブに入っています。 プロセスの秒数制限に引っかかるとかあったな 1000件くらいなら問題無いか ファイル名はgasで取得するよりローカルで取得するのが楽なのでは ありがとうございます。ローカルというとWindows側での操作ですね。調べてみます。 他にもGoogleフォームでタイトルが違うだけのものを100くらい作らないといけません。 質問ばかりですみませんこの件で消えますので GASの開発環境を英語にするのは、Googleアカウントの言語を変更する以外に方法はありませんか? 目的はExceptionなどのエラーを英語で出力してほしいんです。 今日はプロパティの設定でバグが出ているようなんですが、以下のように日本語だと本来の意味とはニュアンスが異なりますし、IssueTrackerで「Data storag error」検索したらすでに報告されているのが分かったので余計な問題判別をせずに済みます。 日本語「データの保存容量エラー」 英語「Data storage error」 gmailにおいて、添付を外して転送ということって可能でしょうか? 調べてみた所添付の付け方ばかりが出てきてしまい... Google Apps Script とLINE Messaging APIでLINE BOTを作ってます。 よかったらどうぞ、スクリプト配布中 https://linelabot.info/ google doumentで画像から文字起こしとか簡単にできそうですね 他にいい方法があるのかもしれませんが 共有ドライブのファイルをマイドライブにコピーするにはどうすればいいですか? ずっと前は右クリック→コピーを作成 で出来ていた気がするのですが、 何故か今はショートカットが作成されてしまい、コピーが出来ないようです GAS触りたての赤ちゃんですが スプレッドシートからキーワード検索してHTMLに出力しようと 少し作ってみたらクッソ時間がかかるんですけどそういう使い方は向いてないんですかね? プログラムの書き方が悪いだけなら良いのですが 本ちゃんのスプレッドシートは40000行くらいになります スクリプトの実行時間が何十秒かを過ぎると処理を終了する仕様があったような気がする >>736 そんなかからんと思うけどその時間とキーワードと各セルの文字数までわからんとなんとも言えん >>736 スプレッドシートのアクセス(呼び出し)の「回数」が多いとめちゃ遅くなるよ なるべく高速化とかの解説サイトとかあるから参考にしてみたら? いったん全部読み込んで処理すればいいかと。 本番と同規模のダミーデータでテスト忘れず。 >>741 HTML側でスプレッドシート開いて二次元配列に放り込んでからテーブルに出力してんですけど実用に耐えないくらい時間かかります。 functionで二次元配列に入れるべきなのかな 配列の受け渡しとかいまいちわかんない Browser.msgBox('hoge'); var ui = SpreadsheetApp.getUi(); ui.alert('hoge'); どっちもAndroidスプレッドシートアプリでは動かず一時停止状態のままになってしまいます どうすれば回避できますかね? 処理が終わるまでshowModalDialogで操作させないようにする処理も泥アプリでは動かなくて困っています… 詳しい方助けてください。 当方結婚式のプロフィールムービーを制作しています。 今後、Googleフォームを使って、テロップ入力、写真をお客様自身でアップロードする仕組みを作れと言われて困っています。 問題となっているのが、フォームでの回答後、アップロードした写真がファイル名しかわからない点です。 そこで、アップロードした写真ファイルを一覧化し、PDF化したうえでお客様へ自動返信出来ないかと考えてみました。 GASを使ってなんとか・・と思いましたが、ネットを探してみても方法が見つからず、途方にくれています。 どなたかお力添えをお願いできないでしょうか? 何でフォームじゃなきゃ駄目なのか分からんが、 そんな指示を出すような奴は、 フォームとフォームっぽい何かがあったとしても、違いなんか分かりゃしないぞ。 >>748 できるけど、フォームじゃ何枚も写真をアップさせるのキツそう Googleフォトかドライブにあらかじめアップさせて HtmlServiceで画面作ったほうがいいんじゃないの? scrapingのライブラリでParser とcheeriogs以外で良いのあります? cheerioよさそうだけどjquery知ってる前提でドキュメントが無くてjquery知らないからきつい。メソッドとかjqueryのやつ使えるの? 自宅からスプレッドシートのdoPostに1分毎にテキストを送ってセルに書き込むだけの実験中なのですが、 実行数の所からログを確認すると2000回に1回くらいステータスが「失敗しました」になっています。 自宅の記録ではステータスコードは200が返ってきています。 doPost内をtry~catchにいれてエラーメッセージを書き込もうとしましたが、何も書き込まれていませんでした。 doPostが起動していない…? なぜ失敗しているか分かる方いませんか。 >>748 自作フォームは難しい。 様々なページを作らないといけない 要するにファイルアップローダー、 TeraTerm, Putty みたいな画面が欲しいのでしょ 各顧客用のフォルダを作って、そこへアップロードするのでしょ 自作するのはキツイ。 何かのサービスを使うべき >>752 jQuery で、スクレイピングするだけなら、 要素の取得、HTML・Text の所だけ読めばよい。 全部の文書を、読む必要はない let abc = $( '#abc' ).html( ); console.log( abc ); $( 'CSS セレクター' ) を書けば、jQuery オブジェクトが取得できる。 jQuery( 'CSS セレクター' )でも良い これを実行してみれば? console.log( window.$ ); console.log( window.jQuery ); >>753 doPost は同期処理なのか? 非同期処理なら、コンテキストが異なるから、 try〜catch で捕捉できないのでは? async/await なら、捕捉できるのか? GASからWindows APIを介してWindowsアプリに指示してWindowsアプリの自動操縦て出来ます? これのスプレッドシート+GAS版を作りたいんですが。 https://youtu.be/r_9JLzXMsk4 スプレッドシートのrange.getValues()のreturnで日付が勝手にDate object に変換キャストされるのいらんのだけど 文字列にできますか >>759 Utilities.formatDateで変換してください やっぱ自分でstringに戻すしかないのですね どうも >>758 できない GASはローカルで動いてるわけじゃないからね トリガーを使って、"Sheet1"というシートのA1セルが変更された時のみ他の処理をさせたいのですが、 どのように掛けば良いでしょうか SpreadsheetApp.getActive(); からシート名も取れると思いますが、引数からオブジェクトを指定するなどはできないでしょうか VBAで書くと以下のような感じです Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = "Sheet1" Then Debug.Print "sheet1が変更されました" End If End Sub >>763 function onEdit( e ) { if (e.source.getSheetByName() === "Sheet1" && e.range.getRow() === 1 && e.range.getColumn() === 1) { //なんか処理 } } >>764 おっほおおおおおありがとうございますうううううう!!!! めっちゃ助かりました、この一歩があればあとは 超特急で勉強できそうです、ほんま助かりました function pswV1(contract){ var url = "https://api.pancakeswap.info/api/tokens/" ; + contract; var content = UrlFetchApp.fetch(url).getContentText("UTF-8"); var obj = JSON.parse(content); return Number(obj.data.price); } この関数作って使ってるんだけど、 定期的に再実行させるにはどうしたら良いのかな? 可能なら1分に1回再実行させたい。 >>767 セル内で引数付けて使用してる関数をトリガーで定期実行するにはどうするの? そういうサンプルがみつからない。 とりあえずトリガー設定してみたけど最短1時間しかないね。 取得してるのは仮想通貨のレートだから最長でも5分程度にはしておきたい。 何度もすまん。 無効な引数でエラーになる。 やはりセル内で使用する関数にトリガーは使えないのでは? セル内は =pswV1("0x27327672d1dc51f4dc58c9f413e1fa7e7ad8245e") としています。 いまのところロード時とタブ切り替え時の任意リロード時のみ実行されます。 >>773 それはトリガーじゃ無理だねぇ その関数使うセルって複数ある? >>774 複数あります。 いまのところ5個くらいですが日々変動します。 トリガーがダメならセル内から呼び出す関数からは引数とセル位置だけグローバル配列に入れておいて トリガーから呼んだ関数でまとめて通信させる方法もあるのかなと考え始めてます。 まだ実装してないので動くかわかりませんが。 >>775 それか1分おきにどこでもいいからセル書き換えるようにすれば勝手に再計算されるのでは GASでPhantom JS cloudで動的なページをスクレイピングする時に、どうやらページが重くて表示に時間がかかるため取得できない値があります すでに表示されたサイトに対してjQueryで取得したりPythonとseleniumを使って driver.get(url) time.sleep(30) html = driver.page_source みたいに待機時間を作ればちゃんと取得できるので値は確かに存在しており、GASでうまくいかないのは待機時間がないせいだと思います Phantom JS cloudでも待機時間を入れたいのですが可能でしょうか?どこに入れればよいのでしょうか? フォームの選択肢ラジオボタンA,B,Cの それぞれにバラバラの回答数上限を設定する方法を教えてください。さらにラジオボタン横に残数があるとなお嬉しい >>777 GAS は知らないけど、 Ruby, Selenium Webdriver, Nokogiri では、 要素の検索の timeout を長くするとか、 driver.manage.timeouts.implicit_wait = 30 それか、sleep するとか、 driver.navigate.to url sleep 30 doc = Nokogiri::HTML( driver.page_source ) 機能の23時にはちゃんと動いていたスクリプトが、今朝試してみたらエラーが出てしまってる function doPost(e) { const getdata = JSON.parse(e.postData.getDataAsString()); //略 } という関数を使ってるスクリプトがいくつかあるんだけど、全部 TypeError: e.postData.getDataAsString is not a function というエラーが出るようになってしまった 同じ人いる? 見当はずれな質問も可能性高いんですが, GASでうんこした時間をカレンダー登録するだけのスクリプト書いて, ウェブアプリとしてデプロイしてAndroidのchromeのショートカット作って それをデスクトップに保存して,そのアイコンをクリックすれば自分の Googleカレンダーにうんこした時間登録できるとこまではできたんですが, webショートカットなので当然chromeが起動してエラー画面が表示されちゃう これをクリックしたらwebページも出さずに処理させる方法ってあるんでしょうか? >>784 ありがとうございます. やっぱりそういう目的のものではないんですなあ…… スマホは常時持ち歩いているのでうんこするときに便所でワンクリックで うんこした時刻を記録したいという目的なのでスマホから実行させたいんですよね やっぱりアプリ作るしかないのかしら(´・ω・`) >>785 TermuxのCUIからリクエスト送れないかね >>786 Termux 上で >>784 が教えてくれたclaspをインストールして…… って事ですかね. 現状でもブラウザ開くけど目的の「ワンクリックでうんこした時間を記録」 は叶ってるので,まあうんこした時間記録するだけなのにAndroid上でLinux 環境セットアップしたくないかなって気はする. ……Termuxで実行するときってその実行コマンドをショートカットにして デスクトップにおけますん? >>787 bashで書いたのをctrl + rとかで呼び出せばいいんちゃう >>787 TaskerとTermux用Taskerプラグイン買えばショートカットとか色々なトリガーでコマンド実行できる >>783 のやりたいこととやってみたことを100%理解してるわけじゃないけど、詳しくないなりに考えたのが、自分ならうんこした時間をカレンダーに記録するスクリプトと連携したスプレッドシートがあったとして、IFTTTでボタンウィジェットを押したらそのスプレッドシートに何でもいいから行が追加されるようにして、うんこ記録関数のトリガーはスプレッドシートが更新された時に発動するようにする >>783 キチンとhtml出力して、html内にウインドウ閉じるJavaScriptを入れるってのはダメですか? うわー皆さんいろいろアイディアありがとうございます. >>792 試してみたんですがAndroid環境だと画面閉じないですね… >>791 単純にうんこした時間をGoogleカレンダーに登録したいだけなんすよね… なのでスプレッドシートとかは使いたくなくて,コードは var date = new Date(); CalendarApp.getDefaultCalendar().createEvent("💩",date , date) こんな感じで十分なので,できればこれをandroid上でアイコンに割り当てて一発実行したいのです. >>788 ターミナル開く手間は避けたくて…… >>789 >>790 このどっちかででけそうな気がしてきたのでちょっと試してみます! 共有しているスプレッドシートの 「編集者は権限を変更して共有できます」のチェックボックスを外す(無効にする) ソースコードを教えてください setShareableByEditors(shareable) を使えばできるようなのですが 使い方が分かりません よろしくお願いいたしますm(_ _)m >>795 その関数の引数をfalseにするだけやろ グループ内で簡易なうpろだとして使いたいのですが、ファイルのアップロード、コメントが記入できて、 アップロード先のURLとコメントをスプレッドシートにリスト化してくにはどうしたらいいんでしょうか? ファイルのアップロード、コメント記入してそれをスプレッドシートにリスト化、それぞれは出来たんですが組合わせると動作しません。 なにかサンプルになるようなページを教えていただけると助かります… シートを作る うpするGASを書く アップロード先のURLとコメントをスプレッドシートにリスト化 >ファイルのアップロード、コメント記入してそれをスプレッドシートにリスト化、それぞれは出来たんですが もっと具体的に 出来ればソースとか晒すべき >>793 >>788 >ターミナルを開く手間は、避けたい どこかに、ショートカットを作れないの? 例えば、Windows ならデスクトップにショートカットを作って、 リンク先に、コマンドプロンプトを起動して、 Ruby でスクリプトファイルを実行する C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/script.rb" 注意。書き込めないので、間に@を入れました スプレッドシートのトリガー onSelectionChangeの挙動ホント悪すぎる ここらへんVBAと比べてダメ過ぎだな スプレッドシートのグラフもひどいよ。 setOption(‘vAxes.1.title’,’hoge’)とかも スプレッドシートとhtmlserviceで簡単なwebアプリ作ろうと思ったのですが、ユーザー毎のデータも扱う場合、どうやるのがいいんでしょうか。 アプリの実行者を「ログインしているユーザー」にすると、スプレッドシートへのアクセス件が必要だから、他の人のデータにアクセスされそうで怖い。 だからといって、実行者を「自分」(開発者)にすると、操作してるユーザーが誰なのかを判別できないし・・。 >>802 ユーザーごとのデータってどんなの? スプレッドシートの1行で表現できないもの? >>803 user | name | score aaa@gmail.com | taro | 85 bbb@gmail.com | jiro | 75 みたいにスプレッドシートをDBとして使うWEBアプリの場合、 アプリを「自分(開発者)」として実行すると、ログインユーザーのemailが取得できないから、スプレッドシートから当該ユーザーのデータを取得できない 「アクセスしているユーザー」として実行すれば、ログインユーザーのemailが取得できるけど、このスプレッドシートへのアクセス権を与えないといけないので、他のユーザーの情報も全て見れてしまう ので、普通はどうするものなのかが知りたいです。(有償のworkspaceは使わない前提です) >>804 なるほどね 普通がどうだかわからないけど メアド自動収集をあきらめてユーザーに入力させるか スプレッドシートをDBにするのをやめてCloudSQLを使う かなぁ GAS には、ユーザー認証機能があるの? 認証は、Firebase Authentication じゃないの? const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const pivotSheet = spreadsheet.getSheetByName('a'); const pivotTables = pivotSheet.getPivotTables(); pivotTables.forEach(pivotTable => { const pivotValues = pivotTable.getPivotValues(); pivotValues.forEach(pivotValue => Logger.log(pivotValue)); }); こんなかんじでpivotTablから値をとりたいのですが、ログとしては pivotValueという値しか返ってこないのですが、なんででしょうか? pivotValue.getValue() のようなことがしたいんです。具体的な数値が返ってくるような。 >>807 何も調べてないうえにやったこともないけと、文脈から察すると Logger.log(pivotValue.getValue()) じゃない? >>808 getValue()は使えないみたいなんですよね、not a functionになって getValueでしてみたらnullが帰ってきて謎... ぐぐってもサンプルが出てこなくてまいりましたわ read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる